[Android]Listの表示がころころ変わる

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ひよつこ

[Android]Listの表示がころころ変わる

#1

投稿記事 by ひよつこ » 13年前

お久しぶりです、ひよつこです。
今回もお世話になります。

現在独自の項目を表示するListViewを作成していますが、
ある特定の位置の項目だけがスクロールすると表示が変わってしまいます。
そこで調べてみたところAdapterのgetView()の第一引数のint positionが
スクロールするたびに変更されています。
さらにその現象が起こるのは決まって9の倍数のpositionの項目だけです。
(0,1,2...8,9,0,1...とpositionは0から9までの数で循環しています)

いったい何が原因なのでしょうか。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: [Android]Listの表示がころころ変わる

#2

投稿記事 by ISLe » 13年前

ひよつこ さんが書きました:そこで調べてみたところAdapterのgetView()の第一引数のint positionが
スクロールするたびに変更されています。
変更されています、とはどういうことですか?
getViewはpositionに対応するアイテムのViewを返すのが仕事ですから、勝手に決め付けるものではないと思いますが。

AdapterのgetViewで返したViewが素直に表示されているだけでしょう。
getViewで返すViewが間違っているのが原因であるはずです。

ひよつこさんが間違ったコードを書いているのが原因で、そのコードを知る由もなく原因が分かるはずもありません。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: [Android]Listの表示がころころ変わる

#3

投稿記事 by へにっくす » 13年前

問題に出くわしたら、同じ現象で悩んでいる人がいないか検索してみてはどうでしょう?
以下が参考になりますかね。みていたらすみません。

getView が呼ばれるタイミングと動作
ListView の表示時に無駄が多すぎなのではないか?
written by へにっくす

ひよつこ

Re: [Android]Listの表示がころころ変わる

#4

投稿記事 by ひよつこ » 13年前

返信ありがとうございます。

同様の現象が書かれているサイトを探してみたところ、
いわゆる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文は何を意味するのでしょうか。
また、今回の異常の原因はこの2文が抜けていたことなのでしょうか。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: [Android]Listの表示がころころ変わる

#5

投稿記事 by ISLe » 13年前

ひよつこ さんが書きました:この2文は何を意味するのでしょうか。
アイテムビューの中からアイテムビューを構成する各ビューを探すとき、毎回findViewByIdを使うと遅いので、各ビューへの参照を持つだけのクラスを作ってアイテムビューのタグに登録しておきます。
アイテムビューが再利用される(convertView != null)ときは、タグを取得し各ビューへの参照を取り出してそのまま使います。

Googleのカンファレンスで紹介された高速化テクニックだそうです。
ひよつこ さんが書きました:また、今回の異常の原因はこの2文が抜けていたことなのでしょうか。
アイテムビューが再利用されるようになると、ViewHolderが空のまま使われるので、getViewメソッドがNullPointerExceptionで中断しますね。
すべてのアイテムビューがおかしくなって不思議ではないのですが。
9の倍数の項目以外も正しい内容ではなく、同じ内容が繰り返し表示されていたのではないでしょうか。

ひよつこ

Re: [Android]Listの表示がころころ変わる

#6

投稿記事 by ひよつこ » 13年前

返信ありがとうございます。

どうやらあの2文が問題だったようです。
よくわからなかったので助かりました。

次回もよろしくお願いします。

閉鎖

“C言語何でも質問掲示板” へ戻る