ネットワーク上の画像を読み込むのにVolleyを使う方法で最初に見た記事がImageLoader#getImageListenerでリスナーを作ってImageLoader#getImageContainerを作る方式だったのでそれを使っていたが、Google I/O 2013 の動画に出てきたNetworkImageViewを使うと自分でリクエストをキャンセルする必要もなくて楽だった(ただし動画のスライドはパッケージ名が違っているので注意)。

レイアウトでImageViewの代わりにNetworkImageViewを配置して:

    <com.android.volley.toolbox.NetworkImageView
            android:id="@+id/hoge"
            ...>

setImageUrlを呼び出せばそれだけでOK:

    NetworkImageView imageView = (NetworkImageView) convertView.findViewById(R.id.hoge);
    imageView.setImageUrl(url, imageLoader);

ListViewのAdapterなどでViewを使いまわされる場合にも自分でキャンセルする必要がない。またアクティビティだかフラグメントが非アクティブになる時にも自動的にキャンセルされる(らしい)。

getImageListenerで指定していた第2,第3引数のdefaultImageResIderrorImageResIdも設定できる:

    imageView.setDefaultImageResId(defaultImageResId);
    imageView.setErrorImageResId(errorImageResId);

普段はネットワークのURLから読み込むけど、ある条件ではリソース中のnoimageを表示したい、という場合には上記のdefaultImageResIdを設定して、imageView.setImageUrl(null)とすればよい。

この簡単さ、いや逆になんで最初からこういうのなかったんだ、という気にさえなってくる。