
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获取的效率,从而提高性能。
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年05月04日 03时22分40秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
解决github Git clone 慢的问题
2021-05-14
一张图搞定RPC框架核心原理
2021-05-14
Scala中的包
2021-05-14
参加阿里的Java面试经验
2021-05-14
Python微信公众号
2021-05-14
他来了他来了,他带着云栖大会的免费门票走来了
2021-05-14
Oracle笔记
2021-05-14
如何复用外部shell脚本
2021-05-14
JAVA集合类Collection浅析
2021-05-14
获取linux 主机cpu类型
2021-05-14
限流的算法有哪些?
2021-05-14
Failed to notify build listener.
2021-05-14
TextWiew单个线条
2021-05-14
Android Studio updating indices 一直刷新和闪烁
2021-05-14
个人购买服务器问题?
2021-05-14
pwntools编写技巧
2021-05-14
How2Heap笔记(三)
2021-05-14
go--microSocket服务端 php客户端
2021-05-14
如何修改Pspice元件库中元件的模型参数?
2021-05-14
小程序提交新数据后如何返回上一页并刷新数据?
2021-05-14