Android面试题:ListView

目录

相关文章:

一、ListView为什么会发生数据错乱,解决办法是什么?

二、Item控件抢占焦点:例如,Item中有CheckBox控件,该控件就会导致Item触发不了点击事件。

三、ListView中的ViewHolder模式及其作用

相关文章:


相关文章:

listview数据错乱、重复的原因分析与解决方案(8543阅读量 4赞)

Android ListView工作原理完全解析,带你从源码的角度彻底理解 (12w阅读量  240赞  郭霖)

Android ListView异步加载图片乱序问题,原因分析及解决方案(7w阅读量  153赞  郭霖)

https://github.com/hongyangAndroid/baseAdapter(鸿杨的 github 项目)

一、ListView为什么会发生数据错乱,解决办法是什么?

原因分析

通过setTag避免重复渲染,第一屏界面肯定没有问题,因为没有可复用的,但继续向下滑动时,就会出现复用了。下面这张图很好的说明了复用的情形:

假设一屏只能显示7个item,当item滑动到item8时,adapter的getView方法就不会再去调用inflate方法渲染页面,而是直接复用item1的页面。

需要注意的是,在滑动时,只有当最上面的item完全消失后,下面刚出来的item才会复用它的convertView,如果二者能同时出现,比如当最上面的item消失了50%,最下面的item露出了10%,那么最下面的item复用的不是最上面的item,而是最上面的item再往上的那个item。(有点拗口,但我觉得说的很明白了,上面那张图只供理解参考)

解决办法:ListView使用CheckBox会导致数据错乱问题,原因是数据复用。
解决办法一:在Bean中设置一个参数 private boolean isChecked; 用来实时记录CheckBox的checked状态。
解决办法一:使用集合记录CheckBox的checked状态。

二、Item控件抢占焦点:例如,Item中有CheckBox控件,该控件就会导致Item触发不了点击事件。

解决办法一:给CheckBox设置属性:android:focusable="false"
解决办法二:给父布局设置属性:android:descendantFocusability="blocksDescendants"

为什么会出现焦点抢占的问题呢,可以从源码角度进行分析:

AbsListView --> onTouchEvent() --> MotionEvent.ACTION_UP:  --> 
 


if (inList && !child.hasExplicitFocusable()) {
                    if (mPerformClick == null) {
                        mPerformClick = new PerformClick();
                    }
 
                    final AbsListView.PerformClick performClick = mPerformClick;
}

!child.hasExplicitFocusable() 可以看到只有在子空间没有获取焦点的时候事件才能往下传递。

三、ListView中的ViewHolder模式及其作用

相关文章:

ListView中的ViewHolder模式及其作用(阅读量2527)

Android——ViewHolder的作用与用法

ListView 优化之 ViewHolder 复用机制(阅读量1671)

ViewHolder模式,可以减少findViewById方法的调用,提高子View获取的效率,从而提高性能。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值