您应该在设备中缓存图像以防止再次加载图像。
创建一个名为LruBitmapCache.java的类并添加以下代码。这个类负责在磁盘上缓存网络映像。
LruBitmapCache.java
import com.android.volley.toolbox.ImageLoader.ImageCache;
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
public class LruBitmapCache 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 LruBitmapCache() {
this(getDefaultLruCacheSize());
}
public LruBitmapCache(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);
}
}
创建名为AppController.java类,并粘贴以下内容。这是一个单例类,用于初始化所需类的全局实例。凌空相关的所有对象都在这里初始化:
import YourPakageName.LruBitmapCache;
import android.app.Application;
import android.text.TextUtils;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;
public class AppController extends Application {
public static final String TAG = AppController.class.getSimpleName();
private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;
LruBitmapCache mLruBitmapCache;
private static AppController mInstance;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
}
public static synchronized AppController getInstance() {
return mInstance;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
mRequestQueue = Volley.newRequestQueue(getApplicationContext());
}
return mRequestQueue;
}
public ImageLoader getImageLoader() {
getRequestQueue();
if (mImageLoader == null) {
getLruBitmapCache();
mImageLoader = new ImageLoader(this.mRequestQueue, mLruBitmapCache);
}
return this.mImageLoader;
}
public LruBitmapCache getLruBitmapCache() {
if (mLruBitmapCache == null)
mLruBitmapCache = new LruBitmapCache();
return this.mLruBitmapCache;
}
public <T> void addToRequestQueue(Request<T> req, String tag) {
req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
getRequestQueue().add(req);
}
public <T> void addToRequestQueue(Request<T> req) {
req.setTag(TAG);
getRequestQueue().add(req);
}
public void cancelPendingRequests(Object tag) {
if (mRequestQueue != null) {
mRequestQueue.cancelAll(tag);
}
}
}
现在打开你的AndroidManifest.xml文件,并在标签中添加Application.java类:
<application
android:name="YourPakageName.app.AppController"> ....</application>
之后,它进入您的适配器,并添加如下代码:
private Context context;
ImageLoader imageLoader =
YourPakageName.AppController.getInstance().getImageLoader();
private RequestQueue queue;
private LruCache<Integer, Bitmap> imageCache;
和:
public MyCustommAdapter(Context context, int resource, List<YourModel> objects) {
super(context, resource, objects);
this.context = context;
this.postList = objects;
final int maxMemory = (int)(Runtime.getRuntime().maxMemory() /1024);
final int cacheSize = maxMemory/5;
imageCache = new LruCache<Integer, Bitmap>(cacheSize);
queue = Volley.newRequestQueue(context);
}
现在,你可以简单地得到URL的图像,并显示在列表视图:
imageLoader.get(image_url, new ImageLoader.ImageListener() {
@Override
public void onErrorResponse(VolleyError error) {
//Log.e(TAG, "Image Load Error: " + error.getMessage());
}
@Override
public void onResponse(ImageLoader.ImageContainer response, boolean arg1) {
if (response.getBitmap() != null) {
// load image into imageview
holder.title_img.setImageBitmap(response.getBitmap());
}
}
});
如果缓存的图像重用,那么shud不是一个滞后。此外,当我断开中间的互联网时,图像抖动以任何方式再现。但是,这些都不是这样的... –
甚至listview可以回收视图! –
普通列表视图不回收视图,Recycler View是ListView的一个扩展,它向您显示onBindViewHolder,并且此方法创建或回收视图。 – rik194