listview异步加载图片大家都知道有复用问题
1.在滑动过程中,会出现复用 如图所示
可以用setTag的方式来使url和imageview一一对应的方式来实现 渲染。
在绘制bitmap到imageview的时候,如果发现tag不一致,(因为异步加载之后再渲染的机制,可能第一次的图片拿过来的时候,已经滑动到复用的情况,那么第一次的图片其实已经不应再被渲染了)就不再渲染这张图片。
这种情况是比较容易理解的。
2.第二种情况,更为基础但是更难理解。
在没有滑动的情况下,其实屏幕中的所有‘项’,都不存在复用的情况
其实是在onMeasure的过程中会产生这种情况,onLayout不会。
但是在初始化(onMeasure)的过程中,item1的imageview其实已经被设置过不同的url对应bitmap值了。
这种情况下如何保证正确性呢(不闪烁而且保证图片确实是item1应该对应的那张图片)
虽然 不存在复用的情况,但是也可以通过 setTag的方式来使url和imageview一一对应的方式来实现 渲染。这种方法解决。
虽然这种其实不是复用 ,但是跟复用的情况是类似的,都是url和imageview的对应关系会变化导致。
只不过 listview的默认实现会让非滑动的情况下, item1在measure和layout的过程中设置不同的值, 但是最终一定会让item1设置为那个正确的值。
注意点:
getView的调用一般在前,也就是设置tag或者其他的类似索引在主线程中,会早执行。(这就是最后渲染的机制,他会以这个索引为准)
因为是异步加载,异步加载和渲染 如果使用AsyncTask 或 ExecutorService, 能够保证task service内部的线程执行的同步,但是因为是另外一个线程,不能保证和getView中的索引的设置 同步,所以在渲染的时候验证,这个验证时机相比getView的索引设置肯定是有延迟的。时间点在对应的主线程设置tag或其他索引之后。(只保证对应的那个索引设置,其他的索引设置也可能在这个渲染验证时机之前,但是因为验证的时候要去对应索引,所以验证不通过,也就是索引对不起来,不一致,就不会做渲染,这样保证图片不闪烁而且正确)。