说下前几天遇到的一个小问题,关于RecyclerView条目选中状态的保存.众所周知,RecyclerView被创造出来用于条目的回收利用,可是,当前面回收的条目带有一些特殊的状态(区别于未选中状态),那么滑动的时候,后面的条目会重复这些状态,因而你的视图就彻底混乱了,这并非你想要的效果,那么就颇有必要来谈谈这个选中状态的复用了.ide
此外,条目的选中与未选中状态,相似于一个CheckBox的勾选状态,咱们不妨假设RecyclerView列表条目中有一个CheckBox(能够根据这个CheckBox的勾选状态来显示不一样的视图,CheckBox的样式很灵活,不影响你的布局效果),那么关于CheckBox的状态保存就是如今要讨论的问题了.布局
CheckBox有它本身的选中监听,选中状态isChecked=true时,你能够显示选中视图;非选中状态isChecked=false时,你能够显示非选中视图;单个条目的选中状态是没有问题的,一旦滑动,那么问题就来了,后面未选中的条目复用了以前的条目的选中状态,因而就形成了混乱.spa
若是咱们记录并储存位置和选中的状态,在RecyclerView.Adapter的onBindViewHolder中,根据当前position去取出该位置的状态,而后根据状态来显示相应的视图,就能搞定了.code
还有一种作法也很容易想到,那就是把CheckBox的选中状态做为填充数据bean的一个字段属性,那么每次建立条目,即走onBindViewHolder方法时,都拿出bean中的isChecked属性,根据这个属性来判断当前应该显示什么样的视图.blog
说下本身的实现方式吧,按常理应该用个双列集合map来保存位置和选中的状态,我不想这么作,我用一个List<Integer> posList来记录选中的位置,再在RecyclerView.Adapter的onBindViewHolder中判断当前的position是否在这个集合中,而后事件
mHolder.cb.setChecked(posList.contains(position) ? true : false);这样就能够正常显示选中条目的视图了;值得注意的是在CheckBox的选中事件中动态地根据选中与否来到posList集合中添加或异常该position.rem
Talk is cheap , show me the code.it
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);
之前遇到问题,老是没有去梳理、记录和总结 , 弄得好像每次都是遇到一个新问题同样 , 这个问题我记得处理过屡次了.分析其原理,总结应对方法, 但愿下次再碰到 , 能信手拈来 , 游刃有余...io