課題
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()を使った方が無難かと。