ListViewを使ったアプリを作っていて困ったのは、関係ないはずのセルに別のセルのデータが表示されることでした。
いろいろといじっていてわかったのですが、ListViewの中に表示される各Viewは、アイテムの数だけ生成されるわけではないのですね。
一度に表示されるViewの数だけ生成して、その後はそのViewを使い回しているようです。
(動作としてはそんな感じでしたが、実際はもっと複雑なのかも)
携帯機という限られたメモリの中でやりくりするには、確かにこの方法が良いのでしょうね。
さてさて、そんなこともあり、おさらいの意味も込めて、簡単なListViewのサンプルを作ってみました。
やっていることは、↓こんな感じ。
・リストが空の時は「no data.」と表示する。
・ボタンを押すごとにアイテムを増やす。
・ArrayAdapterを継承したクラスを作って、自分で中身を描画する。
ListViewで中の各セルを自由に描画したいと思ったら、ListAdapterを継承する必要があるわけですが、そのときにベースにするのは「BaseAdapter」か「ArrayAdapter」だと思います。
「BaseAdapter」だと4つくらいメソッドを実装する必要がありますが、ArrayAdapterはコンストラクタとせいぜいgetView()というメソッドだけ。
簡単に作るならArrayAdapterで良いのかな、と思います。
今回のサンプルではやっていませんが、巷のサンプルコードでは生成されたViewの中の情報を表示する各View(例えばImageViewとかTextViewなど)をHolderというようなクラスを作って保持していることがあります。
Viewが使いまわされることが決まっているのであれば、何度もfindViewById()を行わなくて済むので効率的ですね。
ただ、そのHolderをViewのsetTag()で保持しているのが、個人的になんとなく納得いかないのです。
気になる方は違いを比較してみるのも良いと思います。
考えてみたら、記事内にコードを書かずに解説するというのは微妙ですね。
サンプルを置いてあるとはいえ、ダンロードして展開してソースを見るというのは手間ですしね…。
今後の記事の書き方は変えた方が良いかもしれませんね…。
とりあえず、↓いつものようにサンプルです。
ListViewTest.zip