关于RecyclerView条目复用
前言
说下前几天遇到的一个小问题,关于RecyclerView条目选中状态的保存.众所周知,RecyclerView被创造出来用于条目的回收利用,但是,当前面回收的条目带有一些特殊的状态(区别于未选中状态),那么滑动的时候,后面的条目会重复这些状态,于是你的视图就完全混乱了,这并不是你想要的效果,那么就很有必要来谈谈这个选中状态的复用了.
此外,条目的选中与未选中状态,类似于一个CheckBox的勾选状态,我们不妨假设RecyclerView列表条目中有一个CheckBox(可以根据这个CheckBox的勾选状态来显示不同的视图,CheckBox的样式很灵活,不影响你的布局效果),那么关于CheckBox的状态保存就是现在要讨论的问题了.
分析
CheckBox有它自己的选中监听,选中状态isChecked=true时,你可以显示选中视图;非选中状态isChecked=false时,你可以显示非选中视图;单个条目的选中状态是没有问题的,一旦滑动,那么问题就来了,后面未选中的条目复用了之前的条目的选中状态,于是就造成了混乱.
如果我们记录并储存位置和选中的状态,在RecyclerView.Adapter的onBindViewHolder中,根据当前position去取出该位置的状态,然后根据状态来显示相应的视图,就能搞定了.
还有一种做法也很容易想到,那就是把CheckBox的选中状态作为填充数据bean的一个字段属性,那么每次创建条目,即走onBindViewHolder方法时,都拿出bean中的isChecked属性,根据这个属性来判断当前应该显示什么样的视图.
实现
说下自己的实现方式吧,按常理应该用个双列集合map来保存位置和选中的状态,我不想这么做,我用一个List<Integer> posList来记录选中的位置,再在RecyclerView.Adapter的onBindViewHolder中判断当前的position是否在这个集合中,然后
mHolder.cb.setChecked(posList.contains(position) ? true : false);这样就可以正常显示选中条目的视图了;值得注意的是在CheckBox的选中事件中动态地根据选中与否来到posList集合中添加或异常该position.
Talk is cheap , show me the code.
mHolder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
mHolder.iv_state.setImageResource(b ? R.drawable.selected : R.drawable.unchecked);
if (b) {
if (!posList.contains(position)) {
posList.add(position);
}
//数据操作 } else {
if (posList.contains(position)) {
int i = posList.indexOf(position);
posList.remove(i);
}
//数据操作
}
}
});
mHolder.cb.setChecked(posList.contains(position) ? true : false);
总结
以前遇到问题,总是没有去梳理、记录和总结 , 弄得好像每次都是遇到一个新问题一样 , 这个问题我记得处理过多次了.分析其原理,总结应对方法, 希望下次再碰到 , 能信手拈来 , 游刃有余...
关于RecyclerView条目复用的更多相关文章
- 基于场景解析RecyclerView的回收复用机制原理
最近在研究 RecyclerView 的回收复用机制,顺便记录一下.我们知道,RecyclerView 在 layout 子 View 时,都通过回收复用机制来管理.网上关于回收复用机制的分析讲解的文 ...
- 关于RecyclerView嵌套导致item复用异常,界面异常的问题
常规需求: 外层RecyclerView嵌套内层RecyclerView , 在上下滑动的时候会出现item数据以及view的显示异常. 解决办法: 1.重写 getItemViewType 方法 ...
- RecyclerView 和 ListView 使用对比分析
原文地址:http://blog.coderclock.com/2016/08/08/android/RecyclerView%20%E5%92%8C%20ListView%20%E4%BD%BF%E ...
- Android RecyclerView与ListView比较
RecyclerView 概述 RecyclerView 集成自 ViewGroup .RecyclerView是Android-support-V7版本中新增的一个Widgets,官方对于它的介绍是 ...
- 关于RecyclerView你知道的不知道的都在这了(下)
目录 目录 正文 6. Recycler 7. ItemAnimator 8. ItemDecoration 9. OnFlingListener 目录 由于本篇篇幅特长,特意做了个目录,让大伙对本篇 ...
- RecyclerView常见问题解决方案,RecyclerView嵌套自动滚动,RecyclerView 高度设置wrap_content 无作用等问题
1,ScrollView或者RecyclerView1 嵌套RecyclerView2 进入页面自动跳转到recyclerView2上面页面会自动滚动貌似是RecyclerView 自动获得了焦点两 ...
- 利用RecyclerView实现无限轮播广告条
代码地址如下:http://www.demodashi.com/demo/14771.html 前言: 公司产品需要新增悬浮广告条的功能,要求是可以循环滚动,并且点击相应的浮条会跳转到相应的界面,在实 ...
- RecyclerView源码分析(一)--整体设计
RecyclerView这个控件出来已经有一段时间了,如果看这篇文章的你,还没有使用过这个控件.那请先去学习怎样使用.不然看也白看.这里奉上一些关于介绍RecyclerView使用方法的优秀博客: 鸿 ...
- 【转载】RecyclerView源码解析
原文地址:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0307/4032.html 概述 之前面试的时候经常有人问是否用过Re ...
随机推荐
- 【linux入门必备】小白需要掌握的基础知识_不定期更新
因为博主对linux掌握暂时不需要太精通,遇到一个记录一个. 零碎 知识点: 杂类常用命令: 模糊匹配补齐 TAB 系统相关命令: 查阅手册 man 更新软件 sudo apt-get update ...
- 如何使用Web字体?
如何使用Web字体 嵌入Web字体的关键是@font-face规则,通过它可以指定浏览器下载web字体的地址,以及如何在样式表中引用该字体 @font-face { font-family: Voll ...
- poj 2773欧几里德
Happy 2006 Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 5957 Accepted: 1833 Descri ...
- python strip() 函数和 split() 函数的详解及实例
strip是删除的意思:split则是分割的意思.strip可以删除字符串的某些字符,split则是根据规定的字符将字符串进行分割. 1.Python strip()函数 介绍 函数原型 声明:s为字 ...
- 【图论】Self-Assembly(6-19)
[UVA1572]Self-Assembly 算法入门经典第6章6-19(P172) 题目大意:有一些正方形,每条边上都有A-~Z- A+~Z+的编号,或者00,A+的边可以拼A-,反之亦然.00的边 ...
- BZOJ 2049 [Sdoi2008]Cave 洞穴勘测(动态树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2049 [题目大意] 要求支持树的断边和连边,以及连接查询 [题解] LCT练习题 [代 ...
- 【线段树】hihocoder 1586 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 I. Minimum
题意:给你一个序列(长度不超过2^17),支持两种操作:单点修改:询问区间中最小的ai*aj是多少(i可以等于j). 只需要线段树维护区间最小值和最大值,如果最小值大于等于0,那答案就是minv*mi ...
- 【后缀自动机】【拓扑排序】【动态规划】hihocoder1457 后缀自动机四·重复旋律7
解题方法提示 小Hi:我们已经学习了后缀自动机,今天我们再来看这道有意思的题. 小Ho:好!这道题目让我们求的是若干的数字串所有不同子串的和. 小Hi:你能不能结合后缀自动机的性质来思考如何解决本题? ...
- 实验四 Android程序设计-5
点击button按钮,进入下一活动,"the third activity"
- kong结合consul
早期版本 ./etcdctl ls / --recursive /name /name1 /name1/wyc /name1/wu /name1/chao /name1/chao/age ------ ...