« お名前.comでドメインを取るな | トップページ | Gmail Public Labels API は selection が使えない »

2013.12.01

ListView に自作の Adapter を使うときの注意点?

だだのメモ。
いまいちよくわからん動作なのでメモ。

BaseAdapter を継承した Adapter を、ListView#setAdapter() して使っている場合、BaseAdapter#notifyDataSetChanged() を呼ぶと、getView(0, null, xxx) が呼ばれるみたいだ。
ListView 側の ListView#invalidateViews() を呼んでも、同様に呼ばれる。
ListView#invalidate() では呼ばれない。

通常は画面サイズ分の十分な数の View を作ったら、もう新しい View を作る必要はないのだが、BaseAdapter#notifyDataSetChanged() or ListView#invalidateViews() を呼んだ時は position=500 とかを表示してる場合でも、position=0 が呼ばれてから、position=500, 501, 502, .. が呼ばれる。

で、position=500, 501, 502, ...  は以前に作った空いた View が渡されるので、更新すればいいだけなんだけど、position = 0 のは  convertView = null で呼ばれる。
ので、新しい View を作る必要があって、、でも、新しい View を作っても 500 行目を表示してたら使われない。
直後に 0 行目までジャンプしても、position = 0 で convertView = 過去に作った空いたやつ、の方の事が使われてたりして、表示がおかしくなる。。

というのでハマった。

なんか間違ってる??

|

« お名前.comでドメインを取るな | トップページ | Gmail Public Labels API は selection が使えない »

Android」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/20208/58674013

この記事へのトラックバック一覧です: ListView に自作の Adapter を使うときの注意点?:

« お名前.comでドメインを取るな | トップページ | Gmail Public Labels API は selection が使えない »