hyoromoのブログ

最近はVRSNS向けに作ったものについて書いています

Adapter#getViewの挙動について

今日は ListView に表示させるために使う事になる Adapterメソッド getView の仕組みについて書きます。
と言っても、eclipseデバッグモードで挙動を確認しているだけなため、間違ってる事を書いてるかも!そのときはご指摘お願いします。

図解

例えば画面に5行のテキストが一覧表示されている場合。
以下の図は長方形が一つの List 、赤い枠が画面上に見えている範囲です。
第一状態
一番左の状態から下へスクロールされると、真ん中の状態、一番右の状態へと変わっていきます。
一行分スクロールした場合、先頭のListが画面外に行き、6行目のListが画面内に表示されます。
ちなみに、このListが新たに表示されるタイミングで ArrayAdapter#getView メソッド*1が CALL されます。

第二状態
さらに一番左の状態から下へスクロールすると、真ん中の状態、一番右の状態へと変わっていきますが...
一番下に新たに作成されたList番号に注目!これは List の一番上にあったものが再利用されたものです。
この際に CALL される ArrayAdapter#getView メソッドにも変化があります。

再利用時の変化

ArrayAdapter#getView(int position, View convertView, ViewGroup parent)
第一引数:List番号(添字)第二引数:ListのView情報第三引数:分からない*2


一つ目の画像のように。1から6が初めて作成される場合は、第二引数は null で渡ってきます。
二つ目の画像のように。1が再利用される場合は、第二引数は view が渡ってきます。これは一つ目の画像の時に作成された List です。

まとめ

再利用されることを理解しておかないと、Adapter の拡張に手こずると思うので抑えておきたいポイントでした。

*1:クラスはArrayAdapterでなくとも、Adapterなら全て同じ動作なはずです。

*2:たぶん全Listを束ねてるwidgetだと思う