前言

说下前几天遇到的一个小问题,关于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条目复用的更多相关文章

  1. 基于场景解析RecyclerView的回收复用机制原理

    最近在研究 RecyclerView 的回收复用机制,顺便记录一下.我们知道,RecyclerView 在 layout 子 View 时,都通过回收复用机制来管理.网上关于回收复用机制的分析讲解的文 ...

  2. 关于RecyclerView嵌套导致item复用异常,界面异常的问题

    常规需求: 外层RecyclerView嵌套内层RecyclerView , 在上下滑动的时候会出现item数据以及view的显示异常. 解决办法: 1.重写  getItemViewType  方法 ...

  3. RecyclerView 和 ListView 使用对比分析

    原文地址:http://blog.coderclock.com/2016/08/08/android/RecyclerView%20%E5%92%8C%20ListView%20%E4%BD%BF%E ...

  4. Android RecyclerView与ListView比较

    RecyclerView 概述 RecyclerView 集成自 ViewGroup .RecyclerView是Android-support-V7版本中新增的一个Widgets,官方对于它的介绍是 ...

  5. 关于RecyclerView你知道的不知道的都在这了(下)

    目录 目录 正文 6. Recycler 7. ItemAnimator 8. ItemDecoration 9. OnFlingListener 目录 由于本篇篇幅特长,特意做了个目录,让大伙对本篇 ...

  6. RecyclerView常见问题解决方案,RecyclerView嵌套自动滚动,RecyclerView 高度设置wrap_content 无作用等问题

    1,ScrollView或者RecyclerView1 嵌套RecyclerView2  进入页面自动跳转到recyclerView2上面页面会自动滚动貌似是RecyclerView 自动获得了焦点两 ...

  7. 利用RecyclerView实现无限轮播广告条

    代码地址如下:http://www.demodashi.com/demo/14771.html 前言: 公司产品需要新增悬浮广告条的功能,要求是可以循环滚动,并且点击相应的浮条会跳转到相应的界面,在实 ...

  8. RecyclerView源码分析(一)--整体设计

    RecyclerView这个控件出来已经有一段时间了,如果看这篇文章的你,还没有使用过这个控件.那请先去学习怎样使用.不然看也白看.这里奉上一些关于介绍RecyclerView使用方法的优秀博客: 鸿 ...

  9. 【转载】RecyclerView源码解析

    原文地址:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0307/4032.html 概述 之前面试的时候经常有人问是否用过Re ...

随机推荐

  1. 【linux入门必备】小白需要掌握的基础知识_不定期更新

    因为博主对linux掌握暂时不需要太精通,遇到一个记录一个. 零碎 知识点: 杂类常用命令: 模糊匹配补齐 TAB 系统相关命令: 查阅手册 man 更新软件 sudo apt-get update ...

  2. 如何使用Web字体?

    如何使用Web字体 嵌入Web字体的关键是@font-face规则,通过它可以指定浏览器下载web字体的地址,以及如何在样式表中引用该字体 @font-face { font-family: Voll ...

  3. poj 2773欧几里德

    Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5957   Accepted: 1833 Descri ...

  4. python strip() 函数和 split() 函数的详解及实例

    strip是删除的意思:split则是分割的意思.strip可以删除字符串的某些字符,split则是根据规定的字符将字符串进行分割. 1.Python strip()函数 介绍 函数原型 声明:s为字 ...

  5. 【图论】Self-Assembly(6-19)

    [UVA1572]Self-Assembly 算法入门经典第6章6-19(P172) 题目大意:有一些正方形,每条边上都有A-~Z- A+~Z+的编号,或者00,A+的边可以拼A-,反之亦然.00的边 ...

  6. BZOJ 2049 [Sdoi2008]Cave 洞穴勘测(动态树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2049 [题目大意] 要求支持树的断边和连边,以及连接查询 [题解] LCT练习题 [代 ...

  7. 【线段树】hihocoder 1586 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 I. Minimum

    题意:给你一个序列(长度不超过2^17),支持两种操作:单点修改:询问区间中最小的ai*aj是多少(i可以等于j). 只需要线段树维护区间最小值和最大值,如果最小值大于等于0,那答案就是minv*mi ...

  8. 【后缀自动机】【拓扑排序】【动态规划】hihocoder1457 后缀自动机四·重复旋律7

    解题方法提示 小Hi:我们已经学习了后缀自动机,今天我们再来看这道有意思的题. 小Ho:好!这道题目让我们求的是若干的数字串所有不同子串的和. 小Hi:你能不能结合后缀自动机的性质来思考如何解决本题? ...

  9. 实验四 Android程序设计-5

    点击button按钮,进入下一活动,"the third activity"

  10. kong结合consul

    早期版本 ./etcdctl ls / --recursive /name /name1 /name1/wyc /name1/wu /name1/chao /name1/chao/age ------ ...