面试小记——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()这个方法


重写gteView()方法

在这段代码中我们首先做的就是去判断convertView是否为空,那么这个convertView是什么呢?

初始化时ListView先请求一个type1视图(getView),这时的convertView在getView中是空(null)。当item1滑动出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。这个时候convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图。如下图所示:


图解item服用的过程

为什么会错乱

明白了item复用的原理后我们就来探究一下错乱的原因吧,通过查看源码我们可以得知原来AbListView中获取getView()和滑动操作是异步进行的,其中滑动操作在一个FlingRunnable的支线程中运行,所以这就导致了在ListView在滑动时可能已经滑动到了第十行,但可能第二行的数据这时就被直接使用了,这就是导致数据加载错乱的根本原因。

源码的注解如图所示:


源码注解

由于滑动和加载是异步进行的,这样就会出现一些意想不到的问题:

a. 行item图片显示重复

b. 行item图片显示错乱

c. 行item图片显示闪烁

解决错乱

知道了错乱的原因,那么解决起来应该就很简单了,我们可以给图片设置tag来避免数据错乱


设置一个tag

当然还有其他的解决办法比如使用第三方的图片加载库来加载图片一样可以解决。

0 0
原创粉丝点击