u-ryo's blog

various information for coding...

Caution on ListView

| Comments

今時ListViewなんてあんまり使わないと思いますが、 ListViewのviewの使い回しでbugがあったのでメモです。 ぼくがやったんじゃないです。

public View getView(int position, View convertView, ViewGroup parent)convertViewを使い回すわけですが、 nullの時とnot nullの時の扱いが微妙に違うんですね。 具体的には、 nullの時だけsetOnItemSelectedListenerを設定して、 そのOnItemSelectedListenerが表示される初回だけ onItemSelectedが発動することを利用してobjectの 設定の一部をしているから、 not nullの時にはその経路を通らず、 objectの一部がnullのままで次に進むとNullPointerExceptionに なるという。 だからこのbugの発現条件は、 「初回表示時のリストの数が画面を2つ以上超える」時、 というわかりにくい、後からでは見つけにくいものになっています。 OnItemSelectedListenerで設定しているのも悪いし、 convertViewnullの時とnullでない時の処理に きちんと心を砕かなかったから、 こういうことになるんですね。

まーでもこんなlevelのbugはまだいぃ方ですけどねー このsoftwareについては。 色々アホなのはホントやる気無くします。

参考: Android GridViewのパフォーマンスを上げよう(1/2)←そうですよね普通気を付けますよね、ListView は Graphical Layout で作ったまま使ってはいけない←そうなんですよ最初、頭の1つだけnullで呼ばれた後画面に見える分だけnot nullで呼ばれ、その後改めてnullで呼ばれるので、何でかなーと思ったものです。ただもぅ今はRecyclerViewだからこんなtipsはもう不要かなーと。

Comments