Android面试题:ListView
发布日期:2021-05-14 18:05:08 浏览次数:19 分类:精选文章

本文共 1264 字,大约阅读时间需要 4 分钟。

目录


相关文章:

(8543阅读量 4赞)

 (12w阅读量  240赞  郭霖)

(7w阅读量  153赞  郭霖)

(鸿杨的 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模式及其作用

相关文章:

(阅读量2527)

(阅读量1671)

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

 

 

上一篇:华为老手机升级系统
下一篇:Execution failed for task ':app:compileDebugKotlin'

发表评论

最新留言

表示我来过!
[***.240.166.169]2025年05月04日 03时22分40秒