今時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
で設定しているのも悪いし、
convertView
がnull
の時とnull
でない時の処理に
きちんと心を砕かなかったから、
こういうことになるんですね。
まーでもこんなlevelのbugはまだいぃ方ですけどねー このsoftwareについては。 色々アホなのはホントやる気無くします。
参考: Android GridViewのパフォーマンスを上げよう(1/2)←そうですよね普通気を付けますよね、ListView は Graphical Layout で作ったまま使ってはいけない←そうなんですよ最初、頭の1つだけnull
で呼ばれた後画面に見える分だけnot null
で呼ばれ、その後改めてnull
で呼ばれるので、何でかなーと思ったものです。ただもぅ今はRecyclerView
だからこんなtipsはもう不要かなーと。