ListView の Height は WRAP_CONTENT を避けるべき
もはや常識なのだろうけど、ListView の Height を WRAP_CONTENT にすると、
http://stackoverflow.com/questions/15232895/same-convertview-instance-is-passed-for-visible-views-in-cursoradapter
この問題が出てしまう。
自分は知らなかったのでメモ。
自分で ListView の Adapter を作る場合、Height を WRAP_CONTENT にすると、複数の position で同じ convertView で呼ばれてしまう。
直後に convertView = null で再度呼ばれるので、新たに view を作ることになり、通常は問題にならないが、画像とか時間かかるのを表示しようとすると、最初に呼ばれた時点で他の position と同じ converView の Pointer を 保持するように Thread を生成して画像取得しにいくので、画像取得後には保持した Pointer の先のを更新してしまい、他の position のを上書いてしまうことになる。 (tag に unique な ID を設定して上書きを避けてても最後に設定した unique ID は重なるので1つは上書いてしまう。)
(java では pointer とは言わないか。参照かな?)
昔から謎で、最初だけの問題なので wait 入れてごまかしていたが、Layout が確定するまでは同じ convertView が渡されてしまうのが仕様っぽいので、WRAP_CONTENT は避けるべき。
MATCH_PARENT なら違う position で同じ contentView で呼ばれることはなかった。
| 固定リンク
| コメント (2)
| トラックバック (0)
最近のコメント