面试小记——listview的问题
来源:互联网 发布:北京大学安金鹏 知乎 编辑:程序博客网 时间:2024/06/03 09:40
文章概述:
1.前提
2.什么是item复用
3.为什么会错乱
4.解决错乱
前提
最近几日一直在忙于面试,各种奇奇怪怪的问题也让我明白了自己的一些不足。没办法,不懂就要学习,这也算是提高自己的一种方式吧。
昨天面试一家直播app公司的时候面试官问了我这样一个问题:
在一个listview里每个item中都有一个动画(gif)播放的view,当我点击item中的button时动画(gif)播放。当有动画播放时滑动listview,偶尔会发生item错位的事件。
问:原因是什么,如何解决?
当我听完这个问题后随口便说道“这是item复用的问题,由于异步加载导致图片错位”
对于接触Android一段时间的同学可能都应该知道listview优化时会用到item复用,但是原理可能不太清楚,接下来我们就来先说一下究竟什么是“item复用”
什么是item复用
在我们平常编写adapter时一般会重写他的个getView()这个方法
在这段代码中我们首先做的就是去判断convertView是否为空,那么这个convertView是什么呢?
初始化时ListView先请求一个type1视图(getView),这时的convertView在getView中是空(null)。当item1滑动出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。这个时候convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图。如下图所示:
为什么会错乱
明白了item复用的原理后我们就来探究一下错乱的原因吧,通过查看源码我们可以得知原来AbListView中获取getView()和滑动操作是异步进行的,其中滑动操作在一个FlingRunnable的支线程中运行,所以这就导致了在ListView在滑动时可能已经滑动到了第十行,但可能第二行的数据这时就被直接使用了,这就是导致数据加载错乱的根本原因。
源码的注解如图所示:
由于滑动和加载是异步进行的,这样就会出现一些意想不到的问题:
a. 行item图片显示重复
b. 行item图片显示错乱
c. 行item图片显示闪烁
解决错乱
知道了错乱的原因,那么解决起来应该就很简单了,我们可以给图片设置tag来避免数据错乱
当然还有其他的解决办法比如使用第三方的图片加载库来加载图片一样可以解决。
- 面试小记——listview的问题
- ListView刷新问题小记录
- 关于面试的一些小记
- ListView小记
- Android面试必问的Listview getview方法问题
- 面试小记1——IOS开发工程师
- 面试小记2——IOS开发工程师
- 面试小记3——IOS开发工程师
- 面试小记4——IOS开发工程师
- 有道面试 第一天 —— 杭州小记 三
- 有道面试 第二天——杭州小记四
- 有道面试 第三天 —— 杭州小记 五
- 有道面试 第四天 —— 杭州小记 六
- 杭州小记 七 ——有道面试 第五天
- 面试小记
- 面试小记
- 面试小记
- 面试小记
- 【路标】我的自学之路
- 小米2s刷回低版本ROM
- 非图像界面服务器执行demo时报错的解决方案
- 七,Java集合类(5)——Queue接口及其实现类
- java解析json的方法
- 面试小记——listview的问题
- 记录下mybatis中#{}和${}传参的区别
- hive 实践(二):hive基本原理
- 关于Xcode注释不能使用问题
- 前端开发人员必须了解的七大技能图谱
- tomcat错误记录
- java URL 类 获取 相关 参数
- stillcap实现
- 数据同步设计