前言

说下前几天遇到的一个小问题,关于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. 转:VMware攻击界面分析

    转:https://comsecuris.com/blog/posts/vmware_vgpu_shader_vulnerabilities/ Wandering through the Shady ...

  2. Java中HashMap(泛型嵌套)的遍历

    //Studnet package yzhou.gen03; public class Student<T> { private T score; public T getScore() ...

  3. CodeForces 740A Alyona and copybooks

    完全背包. 直接做个背包容量为$100000$的完全背包,这样就可以避免繁琐的分类讨论了. #pragma comment(linker, "/STACK:1024000000,102400 ...

  4. 洛谷P1414 又是毕业季 [数论]

    题目传送门 又是毕业季 题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在 ...

  5. NOI2015 D1T2 软件包管理器

    题目传送门; 这个貌似是我这个蒟蒻做的第一道NOI系列的题了吧...这题的算法是树链剖分,其实基本上就是很常见的树剖+线段树,题目既然是要求每次安装或卸载改变的软件包的数目,那么就在每次操作前记录下线 ...

  6. 洛谷——P1618 三连击(升级版)

    P1618 三连击(升级版) 题目描述 将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”. //感谢 ...

  7. 【BZOJ 1119】 1119: [POI2009]SLO (置换)

    1119: [POI2009]SLO Description 对于一个1-N的排列(ai),每次你可以交换两个数ax与ay(x<>y),代价为W(ax)+W(ay) 若干次交换的代价为每次 ...

  8. 【拓扑排序】【DFS】Painting A Board

    [poj1691]Painting A Board Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3902   Accept ...

  9. BZOJ 2342 [Shoi2011]双倍回文(manacher+并查集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2342 [题目大意] 记Wr为W串的倒置,求最长的形如WWrWWr的串的长度. [题解] ...

  10. 活动中使用提示框(Toast)

    任务名称:活动中使用Toast 任务现象:点击button时,会弹出提示框:You Click Button 步骤 1.创建一个项目,新建活动和加载布局.参考: http://8c925c9a.wiz ...