前人未踏の領域へ Androidアプリ開発編

Androidアプリ開発に関する調査メモ置き場。古い記事にはアプリ以外も含まれます。

List内で同じ画像が連続して表示される

課題

Picassoを使用して画像を表示させているが、画面のスクロール中にNo Imageなアイテム内に
隣の画像が表示されてしまい、同じ画像が連続していることがある。どうすればよいか。

原因

ViewHolderを使用している場合、オブジェクトの再利用が行われるが、
Picassoのリクエスト中の画面スクロールにより本来は使われないリクエストが実行された状態となる。
さらにno image画像のセットPicasso経由で行わなかった場合、Picassoのリクエスト結果が遅れて挿入される。

対応

Picassoはちゃんとキャンセル機能を提供しているのでそれを使う。

if (TextUtils.isEmpty(item.imagePath)) {
        Picasso.with(mContext).cancelRequest(holder.imgView);
        holder.imgView.setImageResource(R.drawable.no_image);
} else {
        Picasso.with(mContext)
                .load(item.imagePath)
                .placeholder(R.drawable.no_image)
                .fit()
               .into(holder.imgView);
        }

Picasso.into()内で既存のリクエストはcancelされるので通常は気にする必要がない。
なので本来は no imageの場合にもPicassoを使ってImageViewにセットするでもよいはずなのだが、
drawableリソースがxmlだとloadができないようなのでImageView.setImageResouce()を使った方が無難かと。