为了解决图片的错位闪动我给每个条目的ImageView设置的url为标记,也设置了一个默认图片
获取对应ImageView的Bitmap的方式为:先从缓存中根据url查找,若找到,则通过标记找到ImageView给它设置bitmap;若找不到,开启一个线程下载图片,并通过二次采样获取bitmap,存入缓存并通过标记找到ImageView给它设置图片
出现的bug是:所有图片的第一次加载均正常,如条目A,当我往下滑,把A划出屏幕以后,再向上滑,A的图片就成了我设置的默认图片,而且不会更新为其对应url的图片
代码如下:
// 解决图片的闪动错位问题
holder.ivPic.setImageResource(R.drawable.e);
holder.ivPic.setTag(url);
// 先从缓存中获取图片
if (lruCacheUtils.getBitmapByUrl(url) != null) {
ImageView iv = (ImageView) viewGroup.findViewWithTag(url);
if(iv != null){
iv.setImageBitmap(lruCacheUtils.getBitmapByUrl(url));
}
// holder.ivPic.setImageBitmap(lruCacheUtils.getBitmapByUrl(url));
} else {
new Thread() {
@Override
public void run() {
super.run();
byte[] data = OkHttpUtils.getByteArrayByUrl(url);
if (data != null) {
final Bitmap bitmap = BitmapUtils.getOptionBitmapByByteArray(data);
// 将bitmap存入缓存中
if (bitmap != null) {
lruCacheUtils.saveBitmapByUrl(url, bitmap);
}
// 动态更新ui,应该在主线程中
handler.post(new Runnable() {
@Override
public void run() {
ImageView iv = (ImageView) viewGroup.findViewWithTag(url);
if(iv != null){
iv.setImageBitmap(bitmap);
}
}
});
}
}
}.start();
后来我把从缓存中设置图片得方式改为,直接通过viewholder(管理条目中的view)Imageview设置图片,bug就好了,但我不明白为什么这样
// 先从缓存中获取图片
if (lruCacheUtils.getBitmapByUrl(url) != null) {
// ImageView iv = (ImageView) viewGroup.findViewWithTag(url);
// if(iv != null){
// iv.setImageBitmap(lruCacheUtils.getBitmapByUrl(url));
// }
holder.ivPic.setImageBitmap(lruCacheUtils.getBitmapByUrl(url));