android listview图片错位原理及解决方法
2016-02-23 22:30
246 查看
最近去面试被问到了listview中图片错位的原因,而我一直在往viewholder和tag机制上聊(被虐了),其实viewholder和tag机制只是解决图片错位的方法,而非产生图片错位的原理,回来又赶紧脑补了下~
首先上图
图片错位原理:
如果我们只是简单显示list中数据,而没用convertview的复用机制和异步操作,就不会产生图片错位;重用convertview但没用异步,也不会有错位现象。但我们的项目中list一般都会用,不然会很卡。
在上图中,我们能看到listview中整屏刚好显示7个item,当向下滑动时,显示出item8,而item8是重用的item1,如果此时异步网络请求item8的图片,比item1的图片慢,那么item8就会显示item1的image。当item8下载完成,此时用户向上滑显示item1时,又复用了item8的image,这样就导致了图片错位现象(item1和item8是用的同一块内存哦)。
解决方法:
对imageview设置tag,并预设一张图片。
向下滑动后,item8显示,item1隐藏。但由于item1是第一次进来就显示,所以一般情况下,item1都会比item8先下载完,但由于此时可见的item8的tag,和隐藏了的item1的url不匹配,所以就算item1的图片下载完也不会显示到item8中,因为tag标识的永远是可见图片中的url。
关键代码:
首先上图
图片错位原理:
如果我们只是简单显示list中数据,而没用convertview的复用机制和异步操作,就不会产生图片错位;重用convertview但没用异步,也不会有错位现象。但我们的项目中list一般都会用,不然会很卡。
在上图中,我们能看到listview中整屏刚好显示7个item,当向下滑动时,显示出item8,而item8是重用的item1,如果此时异步网络请求item8的图片,比item1的图片慢,那么item8就会显示item1的image。当item8下载完成,此时用户向上滑显示item1时,又复用了item8的image,这样就导致了图片错位现象(item1和item8是用的同一块内存哦)。
解决方法:
对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); }
相关文章推荐
- 其他零散学习-Android四大组件
- Android 6 Marshmallow USB调试授权
- 解决Android Studio的ADB not responding错误
- android中的类加载器,以及加载机制
- Android学习心得第二课
- 转行自学android,Day3-蒙圈
- Android流媒体播放器介绍
- Android序列化之Serializable和Parcelable
- android开源框架之PullToRefresh概述
- Android Service的生命周期
- Android日常开发60条经验
- Andorid boss直聘 页面跳转效果
- Android Studio快捷键
- android api版本的值及其对应的andriod版本
- Android签名
- Android 获取手机存储信息详解(内存,外存等)
- Android四大启动模式
- 【Android】Cannot reload AVD list问题
- 【Android】Toast显示乱码解决办法
- android点击键盘外部关闭键盘的方法