RecyclerView中CheckBox显示混乱的解决办法
2016-11-12 11:33
387 查看
前言:最近加入了一个团队。独立开发Android端,这对我来说是一个很大的挑战,再以前开发,总有老手带我飙车,很多技术难点和一些第三方工具我都没有接触,现在我必须独自面对这些,但即使是挑战,那就努力面对,慢慢克服。现在这个团队氛围不错,大家都平平等等为了项目的发展默默奉献,没有内耗。大家心中就只有一个念头,将这个项目做好。希望我在这个团队也能得到更多的成长。
现在也没有像以前那么闲,每天有写博客的时间,接下来我会将我在开发中遇到的问题和难点,记录下来,等有空我会将它们理成博客,希望能够为和我一样菜鸟的新手们在开发中少走一些弯路。
RecyclerView和ListView在它们的Item中如果使用了CheckBox的时候,我经常会给checkBox设置OnCheckedChangeListener的监听器,用来监听CheckBox的状态并作出相应的逻辑处理。例如一下代码:
当我们洋洋洒洒的写下以上代码,并进行编译通过的时候,我们以为一切会运行正常。但运行结果却出乎我们意料:
我们选中的CheckBox在下滑以后,再回去发现并没有选中。
关于这个bug的原因其实很简单,我们都知道RecyclerView和ListView都是做到复用的,当我们Debug的时候你会发现,每当我们划动的时候,由于item被复用,checkbox的选中状态会发生改变,每当我们滑动的时候我们的setOnCheckedChangeListener的代码都会被调用。这就是真正造成我们CheckBox状态异常的元凶。
其实想要解决这个bug其实也很简单,我们只要不使用setOnCheckedChangeListener,将监听器改为setOnClickListener就能解决这个问题。
我们改造一下上面的代码:
holder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.checkBox.setChecked(!order.isChecked());
order.setChecked(!order.isChecked());
}
});这样我们就发现,我们的CheckBox的状态能够按照我们想要的方式进行正常的显示了。
现在也没有像以前那么闲,每天有写博客的时间,接下来我会将我在开发中遇到的问题和难点,记录下来,等有空我会将它们理成博客,希望能够为和我一样菜鸟的新手们在开发中少走一些弯路。
RecyclerView和ListView在它们的Item中如果使用了CheckBox的时候,我经常会给checkBox设置OnCheckedChangeListener的监听器,用来监听CheckBox的状态并作出相应的逻辑处理。例如一下代码:
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked){ holder.checkBox.setChecked(true); order.setChecked(true); }else { holder.checkBox.setChecked(false); order.setChecked(false); } } });
当我们洋洋洒洒的写下以上代码,并进行编译通过的时候,我们以为一切会运行正常。但运行结果却出乎我们意料:
我们选中的CheckBox在下滑以后,再回去发现并没有选中。
关于这个bug的原因其实很简单,我们都知道RecyclerView和ListView都是做到复用的,当我们Debug的时候你会发现,每当我们划动的时候,由于item被复用,checkbox的选中状态会发生改变,每当我们滑动的时候我们的setOnCheckedChangeListener的代码都会被调用。这就是真正造成我们CheckBox状态异常的元凶。
其实想要解决这个bug其实也很简单,我们只要不使用setOnCheckedChangeListener,将监听器改为setOnClickListener就能解决这个问题。
我们改造一下上面的代码:
holder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.checkBox.setChecked(!order.isChecked());
order.setChecked(!order.isChecked());
}
});这样我们就发现,我们的CheckBox的状态能够按照我们想要的方式进行正常的显示了。
相关文章推荐
- RecyclerView嵌入CheckBox带来的显示问题的解决办法
- android ListView/Recyclerview滚动时自动调用onCheckedChanged导致CheckBox状态混乱的解决办法
- android ListView/Recyclerview滚动时自动调用onCheckedChanged导致CheckBox状态混乱的解决办法
- RecyclerView中使用CheckBox出现勾选混乱的解决方法
- Android:RecyclerView中Item的VideoView预览图显示黑屏的解决办法
- 解决RecyclerView复用导致EdittText、CheckBox等显示异常的问题
- 关于RecyclerView只显示一行数据的另类解决办法
- 解决RecyclerView复用,导致Item混乱问题,checkbox也类似此做法
- 关于RecyclerView中含有CheckBox,Button等控件失去焦点的解决办法
- Android RecyclerView显示Item布局不一致解决办法
- RecyclerView中使用CheckBox勾选混乱问题解决以及单选功能的实现
- ScrollView嵌套RecyclerView显示不完整,以及滑动延迟的解决办法
- 关于6.0ScrollView嵌套RecyclerView高度不正确显示不全问题解决办法
- android中的textview显示汉字不能自动换行的一个解决办法
- Android ScrollView中嵌套GridView,ListView只显示一行的解决办法
- checkbox属性checked="checked"已有,但却不显示打勾的解决办法
- Echarts字符云tooltip显示混乱问题的解决办法
- android中的textview显示汉字不能自动换行的一个解决办法
- checkbox属性checked="checked"已有,但却不显示打勾的解决办法
- iOS开发- iOS7显示偏差(UITableView下移)解决办法