图片错位问题的本质源于我们的 listview 使用了缓存 convertView,假设一
种场景,一个 listview 一屏显示九个 item,那么在拉出第十个 item 的时候,事
实上该 item 是重复使用了第一个 item,也就是说在第一个 item 从网络中下载
图片并最终要显示的时候,其实该 item 已经不在当前显示区域内了,此时显示
的后果将可能在第十个 item 上输出图像,这就导致了图片错位的问题。
解决方案一 使用findViewWithTag
在getView()方法里面imageView.setTag(url);
在网络请求到 BitmapDrawable 后
ImageView imageView = (ImageView) mListView.findViewWithTag(imageUrl);
if (imageView != null && bitmapDrawable != null) {
imageView.setImageDrawable(bitmapDrawable);
}
解决方案二 双向使用弱引用关联
这种解决方案的本质是要让ImageView和BitmapWorkerTask之间建立一个双向关联,互相持有对方的引用, 在BitmapWorkerTask里面用ImageView的引用获得BitmapWorkerTask的引用,判断是否等于this,是就返回ImageView,否者返回null。
解决方案三 使用NetworkImageView(Volley当中提供的控件)
每个NetworkImageView中都会对应一个ImageContainer,从ImageContainer对象中获取封装的图片请求地址,并拿来和当前的请求地址做对比,如果相同的话说明这是一条重复的请求,就直接return掉,如果不同的话就调用cancelRequest()方法将请求取消掉,然后将图片设置为默认图片并重新发起请求。
来源:oschina
链接:https://my.oschina.net/glfei/blog/3166092