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 = 過去に作った空いたやつ、の方の事が使われてたりして、表示がおかしくなる。。
というのでハマった。
なんか間違ってる??
| 固定リンク
「Android」カテゴリの記事
- Essential Phone PH-1 のバッテリー交換(2021.12.11)
- sysbench をとってみた(2016.07.02)
- ListView の Height は WRAP_CONTENT を避けるべき(2015.12.23)
- Nexus 6 Android 6.0.1 (MMB29K) root化(2015.12.18)
- Nexus 6 Android 6.0.1 (MMB29K)(2015.12.17)
この記事へのコメントは終了しました。
コメント