关于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 ...
随机推荐
- 洛谷 P2947 [USACO09MAR]向右看齐Look Up【单调栈】
题目描述 Farmer John's N (1 <= N <= 100,000) cows, conveniently numbered 1..N, are once again stan ...
- 洛谷P3942将军令
啦啦啦,又是五月天的歌------ 题目传送门 那么来分析下题目;给定你一棵树,告诉你一支队伍能管辖的范围,求能覆盖整棵树的最少队伍数. 嘛,如果不会做,第一个想到的肯定是暴搜嘛,但是代码打起来肯定也 ...
- 解决phpStudy启动网站警告问题
在用phpStudy的时候,在页面中会有一些警告 notice:Undefined variable... notice:Undefined index... 在php.ini里面找到 display ...
- 【DFS】Paintball(6-22)
[UVA11853]Paintball 算法入门经典第6章6-22(P175) 题目大意:有一个1000*1000的正方形战场,西南角坐标(0,0),西北角坐标(0,1000),有n个敌人,每个敌人处 ...
- 【DFS】Gym - 100781A - Adjoin the Networks
给你一个森林,让你把它连接成一颗树,使得直径最小. 就求出每颗树的重心以后,全都往直径最大的那个的重心上连,一般情况是最大/2+次大/2+1,次大/2+第三大/2+2 中取较大者. 还有些特殊情况要特 ...
- bzoj 1783: [Usaco2010 Jan]Taking Turns
1783: [Usaco2010 Jan]Taking Turns Description Farmer John has invented a new way of feeding his cows ...
- 93.数字三角形W(深搜)
2189 数字三角形W 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 数字三角形 要求走到最后mod 10 ...
- 配置友盟最新SDK遇到的问题
编译报错 Undefined symbols for architecture i386:原因:i386是代表模拟器,显示i386错误说明静态库不支持模拟器,只支持真机.友盟最新SDK可能不支持模拟 ...
- Visio中旋转文本框与箭头平行
如图想要让文本框和箭头平行,按住shift,可以画出水平或者垂直的线,线是斜的,用文本框来标识,要框和线平行,那可以这样做: 打开视图 - 任务窗格 - 大小和位置,然后先单击选中斜线 左下角倒数 ...
- 在Visual Studio中开发Matlab mex文件,生成mexw64/mexw32
csunking贡献,2015-9-22 1712 1. 概述 通过使用C/C++与Matlab混合编程,既可以享受到C代码快速执行的速度,又可以方便的使用Matlab众多的库函数和强大的绘图功能 ...