2012/02/07

ListView の表示時に無駄が多すぎなのではないか?

getView が呼ばれるタイミングと動作というエントリで書いたのですが、ListView を表示する時の動作をチェックしていたら少し気になることを見つけました。
先のエントリに載せたコードを動作させたときのログが以下です。

Inflate 0  (position: 0)  1093385840
Display (position: 0)  1093385840
Display (position: 1)  1093385840
Display (position: 2)  1093385840
Display (position: 3)  1093385840
Display (position: 4)  1093385840
Display (position: 5)  1093385840
Display (position: 6)  1093385840
Display (position: 7)  1093385840
Display (position: 8)  1093385840
Display (position: 9)  1093385840
Display (position: 10)  1093385840
Display (position: 0)  1093385840
Inflate 1  (position: 1)  1093396968
Display (position: 1)  1093396968
Inflate 2  (position: 2)  1093401912
Display (position: 2)  1093401912
Inflate 3  (position: 3)  1093406856
Display (position: 3)  1093406856
Inflate 4  (position: 4)  1093411800
Display (position: 4)  1093411800
Inflate 5  (position: 5)  1093416744
Display (position: 5)  1093416744
Inflate 6  (position: 6)  1093421688
Display (position: 6)  1093421688
Inflate 7  (position: 7)  1093426632
Display (position: 7)  1093426632
Inflate 8  (position: 8)  1093431576
Display (position: 8)  1093431576
Inflate 9  (position: 9)  1093436520
Display (position: 9)  1093436520
Inflate 10  (position: 10)  1093441464
Display (position: 10)  1093441464
Inflate 11  (position: 0)  1093451272
Display (position: 0)  1093451272
Display (position: 1)  1093451272
Display (position: 2)  1093451272
Display (position: 3)  1093451272
Display (position: 4)  1093451272
Display (position: 5)  1093451272
Display (position: 6)  1093451272
Display (position: 7)  1093451272
Display (position: 8)  1093451272
Display (position: 9)  1093451272
Display (position: 10)  1093451272

これ、スクロールとかしないで、ただ表示させただけなんですが、かなり無駄なことしてる気がします。
一番右の数字は 参照している View の hashCode で、値が同じ場合は同じインスタンスを見ていることを表します。

上から見ていくと、0列目をInflateしたら、そのインスタンス上に1~10を一回ずつ表示して、もう一回0で上書きして、そのあと1~10をInflateしています。
また11列目にも0~10を上書きしているんですね。

全くもって意味がわかりません。
動作上必要なのでしょうか?
それとも、書いたコードがマズイのでしょうか?

ちょっと調査してみたいと思います。
何かわかったら、またブログに書こうと思いますが、どなたか、詳しい事情をご存知の方は、是非教えてください。


2012/3/2 追記
いならさんにコメントいただき、調査しました。
穀風: ListView は Graphical Layout で作ったまま使ってはいけない

2 件のコメント:

いなら さんのコメント...

自分も同じ現象が発生して困っていました。どうやらListViewのlayout_height、layout_widthにfill_parentを使わなければいけないみたいです。
こちらの記事を参考にしました。
【Androidアプリ】AdapterのgetView()が必要以上に呼ばれる件|べっ、別にWeb言語のことなんか好きじゃないんだからねっ!!///
http://ameblo.jp/shibuya-renga/entry-11062700789.html

Yusuke Miura さんのコメント...

おー、まさに、それですね。
有益な情報をありがとうございます!