お久しぶりです、ひよつこです。
今回もお世話になります。
現在独自の項目を表示するListViewを作成していますが、
ある特定の位置の項目だけがスクロールすると表示が変わってしまいます。
そこで調べてみたところAdapterのgetView()の第一引数のint positionが
スクロールするたびに変更されています。
さらにその現象が起こるのは決まって9の倍数のpositionの項目だけです。
(0,1,2...8,9,0,1...とpositionは0から9までの数で循環しています)
いったい何が原因なのでしょうか。
[Android]Listの表示がころころ変わる
Re: [Android]Listの表示がころころ変わる
変更されています、とはどういうことですか?ひよつこ さんが書きました:そこで調べてみたところAdapterのgetView()の第一引数のint positionが
スクロールするたびに変更されています。
getViewはpositionに対応するアイテムのViewを返すのが仕事ですから、勝手に決め付けるものではないと思いますが。
AdapterのgetViewで返したViewが素直に表示されているだけでしょう。
getViewで返すViewが間違っているのが原因であるはずです。
ひよつこさんが間違ったコードを書いているのが原因で、そのコードを知る由もなく原因が分かるはずもありません。
Re: [Android]Listの表示がころころ変わる
問題に出くわしたら、同じ現象で悩んでいる人がいないか検索してみてはどうでしょう?
以下が参考になりますかね。みていたらすみません。
getView が呼ばれるタイミングと動作
ListView の表示時に無駄が多すぎなのではないか?
以下が参考になりますかね。みていたらすみません。
getView が呼ばれるタイミングと動作
ListView の表示時に無駄が多すぎなのではないか?
written by へにっくす
-
ひよつこ
Re: [Android]Listの表示がころころ変わる
返信ありがとうございます。
同様の現象が書かれているサイトを探してみたところ、
いわゆるViewHolderの使い方に問題がある可能性を発見しました。
そこで、自分の書いたコードを載せます。
実は「ココです!」と書いてある2文が抜けていたのです。
この2文を追加したところいまだ異常は見られていません。
しかしこの2文が意味する処理がイマイチわかりません。
この2文は何を意味するのでしょうか。
また、今回の異常の原因はこの2文が抜けていたことなのでしょうか。
同様の現象が書かれているサイトを探してみたところ、
いわゆるViewHolderの使い方に問題がある可能性を発見しました。
そこで、自分の書いたコードを載せます。
public class CustomAdapter extends ArrayAdapter<CustomData>{
private LayoutInflater lInflater;
public CustomAdapter(Context context,int textViewResourceId,List<CustomData> objects) {
super(context, textViewResourceId, objects);
lInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position,View convertView,ViewGroup parent){
CustomData item = (CustomData) getItem(position);
ViewHolder holder = new ViewHolder();
if(convertView == null){
convertView = lInflater.inflate(リスト項目のレイアウト, null);
holder.image = (ImageView) convertView.findViewById(ImageViewのid);
holder.name = (TextView) convertView.findViewById(TextView1のid);
holder.extention = (TextView) convertView.findViewById(TextView2のid);
convertView.setTag(holder); //ココです!
} else {
holder = (ViewHolder) convertView.getTag(); //ココです!
}
holder.image.setImageResource(item.getImage());
holder.name.setText(item.getName());
holder.extention.setText(item.getExtention());
return convertView;
}
この2文を追加したところいまだ異常は見られていません。
しかしこの2文が意味する処理がイマイチわかりません。
この2文は何を意味するのでしょうか。
また、今回の異常の原因はこの2文が抜けていたことなのでしょうか。
Re: [Android]Listの表示がころころ変わる
アイテムビューの中からアイテムビューを構成する各ビューを探すとき、毎回findViewByIdを使うと遅いので、各ビューへの参照を持つだけのクラスを作ってアイテムビューのタグに登録しておきます。ひよつこ さんが書きました:この2文は何を意味するのでしょうか。
アイテムビューが再利用される(convertView != null)ときは、タグを取得し各ビューへの参照を取り出してそのまま使います。
Googleのカンファレンスで紹介された高速化テクニックだそうです。
アイテムビューが再利用されるようになると、ViewHolderが空のまま使われるので、getViewメソッドがNullPointerExceptionで中断しますね。ひよつこ さんが書きました:また、今回の異常の原因はこの2文が抜けていたことなのでしょうか。
すべてのアイテムビューがおかしくなって不思議ではないのですが。
9の倍数の項目以外も正しい内容ではなく、同じ内容が繰り返し表示されていたのではないでしょうか。
-
ひよつこ
Re: [Android]Listの表示がころころ変わる
返信ありがとうございます。
どうやらあの2文が問題だったようです。
よくわからなかったので助かりました。
次回もよろしくお願いします。
どうやらあの2文が問題だったようです。
よくわからなかったので助かりました。
次回もよろしくお願いします。