android listview图片错位原理及解决方法
最近去面试被问到了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图片错位原理及解决方法相关推荐
- universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法
universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法 参考文章: (1)universal image loader在listview/ ...
- android百度地图覆盖物异步加载图片,Android 百度地图marker中图片不显示的解决方法(推荐)...
目的: 根据提供的多个经纬度,显示所在地的marker样式,如下: 问题: 1.发现marker中在线加载的图片无法显示出来: 2.获取多个对象后,却只显示出了一个marker: 以下为官网实现方法: ...
- java显示一张图片不显示_微信图片不可显示java解决方法
场景: 微信上传了图片素材,返回了图片url,然后不能在img标签中正常显示. 原因是微信做了图片防盗连接. 解决方法: 原理:使用你的服务端脚本,远程抓取图片,然后输出image/* 格式,就可以了 ...
- 【Microsoft Word】编辑文字后,图片位置混乱的解决方法
[Microsoft Word]编辑文字后,图片位置混乱的解决方法 参考文章: (1)[Microsoft Word]编辑文字后,图片位置混乱的解决方法 (2)https://www.cnblogs. ...
- dedecms织梦系统后台验证码图片不显示的解决方法
dedecms织梦系统后台验证码图片不显示的解决方法 参考文章: (1)dedecms织梦系统后台验证码图片不显示的解决方法 (2)https://www.cnblogs.com/afish/p/40 ...
- Failed to resolve: com.android.support:appcompat-v7:27.+ 报错解决方法
Failed to resolve: com.android.support:appcompat-v7:27.+ 报错解决方法 参考文章: (1)Failed to resolve: com.andr ...
- 在Android Studio中打开Android Device Monitor时报错的解决方法
在Android Studio中打开Android Device Monitor时报错的解决方法 参考文章: (1)在Android Studio中打开Android Device Monitor时报 ...
- Tomcat中文乱码问题的原理和解决方法
为什么80%的码农都做不了架构师?>>> Tomcat中文乱码问题的原理和解决方法 自从接触Java和JSP以来,就不断与Java的中文乱码问题打交道,现在终于得到了彻底的解决 ...
- android studio socket 失败,Android应用开发Android Studio建立Socket连接失败解决方法
本文将带你了解Android应用开发Android Studio建立Socket连接失败解决方法,希望本文对大家学Android有所帮助. < Android Studio建立Socket连接失 ...
最新文章
- 计算机基础名词概念(一)
- ButterKnife--View注入框架
- Jquery页面加载效果
- Java 获取命令行输入数据(命令行输入,Scanner类)
- java导入项目存在,如何将预先存在的Java项目导入Eclipse并启动并运行?
- excek快速删除指定行
- Linux 命令(105)—— service 命令
- python 给定n,返回n以内的斐波那契数列
- 接口测试基础——第6篇unittest模块(三)
- u盘制作双系统启动盘及在移动硬盘上安装Linux操作系统
- esp连接服务器的协议,【零知ESP8266教程】WIFI TCP协议通信 TCP服务器示例
- Github TOP100 Android开源,flutter与android混合开发
- python多行注释报错_解决python多行注释引发缩进错误的问题
- 计算机程序员的英文简历,电脑程序员个人英文简历范文
- JavaCV入门教程
- hugepage oracle 12c,Huge page使用的一些问题
- 互联网自动化赚钱的方法
- uni-app 学习: 页面高度设置100%
- 记:数据库课程设计(一)
- (二)Semi-supervised(半监督学习)李宏毅
热门文章
- 视力“小偷”青光眼,会遗传给下一代吗?
- 国内外免费php开源建站程序一览,推荐国内外PHP开源建站程序
- 【稳定性day6】大众点评高可用的方法与实践
- 【图论-二分图】学生的住宿
- 腾讯云服务器安装oracle19c
- wait()以及wait(status)\ waitpid()
- [益智]:三个穷人、两个面包,只切一刀,如何实现公平正义?
- 微信拉黑的人怎么找回来?3步找回“失踪”的好友
- 自适应交通信号控制:SUMO的应用
- linux命令行杀毒工具,Linux下杀毒软件Clamav的安装和使用