最近去面试被问到了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。

关键代码:

// 给 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 listview图片错位原理及解决方法相关推荐

  1. universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法

    universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法 参考文章: (1)universal image loader在listview/ ...

  2. android百度地图覆盖物异步加载图片,Android 百度地图marker中图片不显示的解决方法(推荐)...

    目的: 根据提供的多个经纬度,显示所在地的marker样式,如下: 问题: 1.发现marker中在线加载的图片无法显示出来: 2.获取多个对象后,却只显示出了一个marker: 以下为官网实现方法: ...

  3. java显示一张图片不显示_微信图片不可显示java解决方法

    场景: 微信上传了图片素材,返回了图片url,然后不能在img标签中正常显示. 原因是微信做了图片防盗连接. 解决方法: 原理:使用你的服务端脚本,远程抓取图片,然后输出image/* 格式,就可以了 ...

  4. 【Microsoft Word】编辑文字后,图片位置混乱的解决方法

    [Microsoft Word]编辑文字后,图片位置混乱的解决方法 参考文章: (1)[Microsoft Word]编辑文字后,图片位置混乱的解决方法 (2)https://www.cnblogs. ...

  5. dedecms织梦系统后台验证码图片不显示的解决方法

    dedecms织梦系统后台验证码图片不显示的解决方法 参考文章: (1)dedecms织梦系统后台验证码图片不显示的解决方法 (2)https://www.cnblogs.com/afish/p/40 ...

  6. Failed to resolve: com.android.support:appcompat-v7:27.+ 报错解决方法

    Failed to resolve: com.android.support:appcompat-v7:27.+ 报错解决方法 参考文章: (1)Failed to resolve: com.andr ...

  7. 在Android Studio中打开Android Device Monitor时报错的解决方法

    在Android Studio中打开Android Device Monitor时报错的解决方法 参考文章: (1)在Android Studio中打开Android Device Monitor时报 ...

  8. Tomcat中文乱码问题的原理和解决方法

    为什么80%的码农都做不了架构师?>>>    Tomcat中文乱码问题的原理和解决方法 自从接触Java和JSP以来,就不断与Java的中文乱码问题打交道,现在终于得到了彻底的解决 ...

  9. android studio socket 失败,Android应用开发Android Studio建立Socket连接失败解决方法

    本文将带你了解Android应用开发Android Studio建立Socket连接失败解决方法,希望本文对大家学Android有所帮助. < Android Studio建立Socket连接失 ...

最新文章

  1. 计算机基础名词概念(一)
  2. ButterKnife--View注入框架
  3. Jquery页面加载效果
  4. Java 获取命令行输入数据(命令行输入,Scanner类)
  5. java导入项目存在,如何将预先存在的Java项目导入Eclipse并启动并运行?
  6. excek快速删除指定行
  7. Linux 命令(105)—— service 命令
  8. python 给定n,返回n以内的斐波那契数列
  9. 接口测试基础——第6篇unittest模块(三)
  10. u盘制作双系统启动盘及在移动硬盘上安装Linux操作系统
  11. esp连接服务器的协议,【零知ESP8266教程】WIFI TCP协议通信 TCP服务器示例
  12. Github TOP100 Android开源,flutter与android混合开发
  13. python多行注释报错_解决python多行注释引发缩进错误的问题
  14. 计算机程序员的英文简历,电脑程序员个人英文简历范文
  15. JavaCV入门教程
  16. hugepage oracle 12c,Huge page使用的一些问题
  17. 互联网自动化赚钱的方法
  18. uni-app 学习: 页面高度设置100%
  19. 记:数据库课程设计(一)
  20. (二)Semi-supervised(半监督学习)李宏毅

热门文章

  1. 视力“小偷”青光眼,会遗传给下一代吗?
  2. 国内外免费php开源建站程序一览,推荐国内外PHP开源建站程序
  3. 【稳定性day6】大众点评高可用的方法与实践
  4. 【图论-二分图】学生的住宿
  5. 腾讯云服务器安装oracle19c
  6. wait()以及wait(status)\ waitpid()
  7. [益智]:三个穷人、两个面包,只切一刀,如何实现公平正义?
  8. 微信拉黑的人怎么找回来?3步找回“失踪”的好友
  9. 自适应交通信号控制:SUMO的应用
  10. linux命令行杀毒工具,Linux下杀毒软件Clamav的安装和使用