我们在使用ListView异步加载图片的时候,在快速滑动或网络不好的情况下,会出现图片错位、重复、闪烁等问题,其实这些问题总结起来就是1个问题,我们需要对这些问题进行ListView的优化。
比如ListView上有100个Item,1屏只显示10个Item,我们知道getView()中convertView是用来复用View对象的,由于1个Item的对应1个View对象,而ImageView控件就是View对象通过findViewById()取得的,而我们在复用View对象时,同时这个ImageView对象也被复用了。比如第11个Item的View复用了第1个Item View对象,那末ImageView就同时被复用了,所以当图片没下载出来,这个ImageView(第11个Item)显示的数据就是复用(第1个Item)的数据。
1:Item图片显示重复
这个显示重复是指当前行Item显示了之前某行Item的图片。
比如ListView滑动到第2行会异步加载某个图片,但是加载很慢,加载进程中ListView已滑动到了第14行,且滑动进程中该图片加载结束。第2行已不在屏幕内,根据上面介绍的缓存原理,第2行的View对象可能被第14行复用,这样我们看到的就是第14行显示了本该属于第2行的图片,造成显示重复。
2. Item图片显示错乱
这个显示错乱是指某行Item显示了不属于该行Item的图片。
跟上面的缘由1样。
3. Item图片显示闪烁
上面介绍的另外1种情况,如果第14行图片又很快加载结束,所以我们看到第14行先显示了复用的第2行的图片,立马又显示了自己的图片进行覆盖造成闪烁错乱。
解决方案:
原理:首先给ImageView设置1个Tag,这个Tag中设置的是图片的url,然后在加载的时候获得这个url和要加载那position中的url对照,如果不相同就加载,相同就是复用之前的就不加载了。