Volley のImageLoader を使う

先日は、単に ImageRequest を使うだけのサンプルを書いたので、

com.android.volley.toolbox.ImageLoader を使う方法、

android.support.v4.util.LruCache 継承の
com.android.volley.toolbox.ImageLoader.ImageCache 実装を用意する。

import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
/**
 * BitmapLruCache
 * cacheSize などは適当に
 */

public class BitmapLruCache extends LruCache<String, Bitmap> implements ImageCache {
   public static int getDefaultLruCacheSize(){
      final int maxMemory = (int)(Runtime.getRuntime().maxMemory() / 1024);
      final int cacheSize = maxMemory / 8;
      return cacheSize;
   }
   public BitmapLruCache() {
      this(getDefaultLruCacheSize());
   }
   public BitmapLruCache(int sizeInKiloBytes) {
      super(sizeInKiloBytes);
   }
   @Override
   protected int sizeOf(String key, Bitmap value) {
      return value.getRowBytes() * value.getHeight() / 1024;
   }
   @Override
   public Bitmap getBitmap(String url) {
      return get(url);
   }
   @Override
   public void putBitmap(String url, Bitmap bitmap) {
      put(url, bitmap);
   }
}

// クラス内変数として宣言
ImageLoader mImageLoader;



// onCreate で生成
mImageLoader = new ImageLoader(Volley.newRequestQueue(getApplicationContext()), new BitmapLruCache());


ListView mlistView = (ListView)findViewById(R.id.listView);
mlistView.setAdapter(new ArrayAdapter<Product>(this, 0, mlist){
   LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
   @Override
   public View getView(int position, View convertView, ViewGroup parent){
      if (convertView==null){
         View view = inflater.inflate(R.layout.volley_list_item1, null);
         String url = リストからURLを取得する。
         mImageLoader.get(url ,ImageLoader.getImageListener((ImageView)view.findViewById(R.id.imageView1)
                        , R.drawable.ic_launcher          // 読込中に表示する画像
                        , android.R.drawable.ic_delete    // 読込失敗した時に表示する画像
         ));
         return view;
      }
      return convertView;
   }
   @Override
   public int getCount(){
      return mlist.size();
   }
});
ImageLoader を使うと、読込中に表示する画像/読込失敗した時に表示する画像を指定できるので良いし、すっきりしたコードになる。