最近看了一下RecyclerView这个控件,的确非常好用,但是也并没有摆脱这种问题,recyclerview内部好像自带有控件的复用。
问题的根源还是控件的复用以及异步加载所引起的问题
解决思路:
1.使用缓存,从缓存中加载的速度大大少于从网络加载
2.设置默认图片,当一个item设置个图片然后被复用,而当前显示的图片还没有数据,正在从网络获取,这个时候此item就会显示复用前显示的图片,而当前应该显示的图片从网络中获取到之后就会重新加载上去就出现的图片闪动的情况
3.给ImageView设置TAG
我封装了一个类来进行网络获取加载图片,代码比较简单,用起来也非常方便,诸位可以根据自己的需求进行修改
话不多说上代码:
package My.Utils;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.util.Log;
import android.util.LruCache;
import android.widget.ImageView;
import com.wkk.myutils.R;
import java.io.IOException;
/**
* Created by Think on 2016/4/11.
*/
public class ImageLoader {
private static My.Utils.ImageLoader ImageLoader;
private LruCache<String, Bitmap> lruCache;
public static final int ID = -100;
private boolean Savedlocal = false;//此属性控制是否需要缓存到本地
private Context context;
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)
private ImageLoader(Context context) {
this.context = context;
// 版本低于12 数量 大于等于12 容量
if (Build.VERSION.SDK_INT < 12) {
lruCache = new LruCache<String, Bitmap>(100);
} else {
lruCache = new LruCache<String, Bitmap>(5 * 1024 * 1024) {
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount();
}
};
}
}
public static My.Utils.ImageLoader getInstance(Context context) {
if (ImageLoader == null) {
ImageLoader = new ImageLoader(context);
}
return ImageLoader;
}
/**
* 对外开放方法
* 1.需要设置的Imageview
* 2.图片的URl
* 3.默认图片
*/
public void