首页 > 代码库 > android listview异步加载图片错位,重复,闪烁分析以及解决方案

android listview异步加载图片错位,重复,闪烁分析以及解决方案

我们在使用listview异步加载图片 的时候,在快速滑动或者网络不好的情况下,会出现图片错位,重复,闪烁等问题,其实这些问题总结起来就是一个问题,

比如listview上有100个item,一屏只显示10个item,我们知道getView()中converView是用来复用view对象的,因为一个item的view对象,而imageview控件就是view通过findViewById()获得的,而我们在复用view对象时,也就是说这个imageview也被复用了,比如第11个item的view复用了第一个itemv iew对象,那么imageview就同时被复用了,而显示图片是通过imageview控件,所以当图片没下载出来,就这个imageview显示的数据就是复用的数据

1:item图片显示重复?

这个显示重复是指当前行item显示了之前某行item的图片

比如ListView滑动到第2行会异步加载某个图片,但是加载很慢,加载过程中listView已经滑动到了第14行,且滑动过程中该图片加载结束,
第2行已不在屏幕内,根据上面介绍的缓存原理,第2行的view可能被第14行复用,这样我们看到的就是第14行显示了本该属于第2行的图片,造成显示重复


行item图片显示错乱?
这个显示错乱是指某行item显示了不属于该行item的图片。?
比如ListView滑动到第2行会异步加载某个图片,但是加载很慢,加载过程中listView已经滑动到了第14行,第2行已不在屏幕内,
根据上面介绍的缓存原理,第2行的view可能被第14行复用,第14行显示了第2行的View,这时之前的图片加载结束,就会显示在第14行,造成错乱


行item图片显示闪烁?
上面b的情况,第14行图片又很快加载结束,所以我们看到第14行先显示了第2行的图片,立马又显示了自己的图片进行覆盖造成闪烁错乱


解决方案:

通过上面的分析我们知道了出现错乱的原因是异步加载及对象被复用造成的,如果每次

getView

能给对象一个标识,

在异步加载完成时比较标识与当前行

item

的标识是否一致,

致则显示,否则不做处理即可

通过上面的分析我们知道了出现错乱的原因是异步加载及对象被复用造成的,如果每次

getView

能给对象一个标识,

在异步加载完成时比较标识与当前行

item

的标识是否一致,

致则显示,否则不做处理即可

通过上面的分析我们知道了出现错乱的原因是异步加载及对象被复用造成的,如果每次getView能给对象一个标识,在异步加载完成时比较标识与当前行item的标识是否一致,一致则显示,否则不做处理即可


原理:首先给imageview设置一个tag,这个tag中设置的是url,然后在加载的时候取得这个url和要加载那position中的url对比,如果不相同就加载,相同就是复用以前的就不加载了

android listview异步加载图片错位,重复,闪烁分析以及解决方案