IT虾米网

listview 异步加载图片并防止错位

mate10pro 2018年05月27日 手机开发 1278 0

 

1.图片错位原理: 

  如果我们只是简单显示list中数据,而没用convertview的复用机制和异步操作,就不会产生图片错位;重用convertview但没用异步,也不会有错位现象。但我们的项目中list一般都会用,不然会很卡。 在上图中,我们能看到listview中整屏刚好显示7个item,当向下滑动时,显示出item8,而item8是重用的item1,如果此时异步网络请求item8的图片,比item1的图片慢,那么item8就会显示item1的image。当item8下载完成,此时用户向上滑显示item1时,又复用了item8的image,这样就导致了图片错位现象(item1和item8是用的同一块内存哦)。

 

2.解决方法:

对imageview设置tag,并预设一张图片。 向下滑动后,item8显示,item1隐藏。但由于item1是第一次进来就显示,所以一般情况下,item1都会比item8先下载完,但由于此时可见的item8的tag,和隐藏了的item1的url不匹配,所以就算item1的图片下载完也不会显示到item8中,因为tag标识的永远是可见图片中的url。

 

// 给 ImageView 设置一个 tag 
holder.img.setTag(imgUrl); 
// 预设一个图片 
holder.img.setImageResource(R.drawable.ic_launcher); 
 
// 通过 tag 来防止图片错位 
if (imageView.getTag() != null && imageView.getTag().equals(imageUrl)) { 
    imageView.setImageBitmap(result); 
} 

  

 

评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!