先日は、単に 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 を使うと、読込中に表示する画像/読込失敗した時に表示する画像を指定できるので良いし、すっきりしたコードになる。