仕事でAndroidアプリを作成していて気づいたことが。

ListViewをArrayAdapterを使って生成して表示した時のログを見ていると、getView()が21回も呼ばれていました。画面に表示されているリストのアイテム数は9つだから、9つじゃないの??って思って、いろいろ調べていると、同じ事でお悩みの方がまとめてくれていました。

穀風様の「ListView は Graphical Layout で作ったまま使ってはいけない」というエントリです。

まとめると、レイアウトファイルのListViewのlayout_widthとlayout_heightは両方をmatch_parentにしておかなければ、この現象が起こるとのこと。確かに、私のレイアウトファイルはwrap_contentになっていたので、match_parentに修正して試してみたところ、今度は7回しか呼ばれなくなりました。

予想では9回呼ばれると思っていたのですが。。。

その後、いろいろログを埋め込み確認したところ、listViewのアイテム数は確かに9個なんですが、画面表示時には7個しか表示されていないので、7回呼ばれていただけでした。サイズを変えて、一度に9個表示されるようにしたところ、9回呼ばれるようになりました。

wrap_contentの場合、上記リンク先でも考察してくださっているように、一度最後まで描いてみて、もう一度描画する処理が行われているのに対して、match_parentの場合、1度の描画で最適な回数分の処理を行なっているようです。

ListViewを利用する時はパフォーマンスのことを考慮すると、レイアウトをmatch_parentにするようにしたほうが良さそうです。