RecyclerView中使用CheckBox勾选混乱问题解决以及单选功能的实现
来源:互联网 发布:金庸对悟空传评价知乎 编辑:程序博客网 时间:2024/06/05 02:42
一.RecyclerView + CheckBox勾选混乱问题解决
RecyclerView中使用CheckBox时因为RecyclerView布局会重用,所以在勾选时出现勾选混乱。如图
勾选 0号位和2号位 21 23也被勾选了。
此时适配器中的代码
@Overridepublic void onBindViewHolder(ViewHolder holder, final int position) { holder.mTextView.setText(mList.get(position));}
想要解决勾选混乱问题,可以使用集合添加被勾选的CheckBox位置,然后集合中有的位置则设置为被勾选,没有的位置就设置不被勾选
效果如下:勾选 0 1 2 位置,并未出现勾选混乱
此时的代码
private Map<Integer, Boolean> map = new HashMap<>();@Overridepublic void onBindViewHolder(ViewHolder holder, final int position) { holder.mTextView.setText(mList.get(position)); holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked == true) { map.put(position, true); } else { map.remove(position); } } }); if (map != null && map.containsKey(position)) { holder.mCheckBox.setChecked(true); } else { holder.mCheckBox.setChecked(false); }}
二.ReyclerView+CheckBox实现单选功能
方法:在每次设置CheckBox为true时,都将存有勾选的CheckBox的位置的集合清空,然后在将当前CheckBox加入进去,在通知适配器更新。
效果如下:
错误示例:
private Map<Integer, Boolean> map = new HashMap<>();@Overridepublic void onBindViewHolder(ViewHolder holder, final int position) { holder.mTextView.setText(mList.get(position)); holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked == true) { map.clear(); map.put(position, true); } else { map.remove(position); } notifyDataSetChanged(); } }); if (map != null && map.containsKey(position)) { holder.mCheckBox.setChecked(true); } else { holder.mCheckBox.setChecked(false); }}
异常:java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling
提示说:不能在RecyclerView计算layout或者滑动的时候使用 notifyDataSetChanged() 方法
解决问题:添加判断条件,不在RecycerView计算layout或滑动的时候 通知适配器更新
private boolean onBind;@Overridepublic void onBindViewHolder(ViewHolder holder, final int position) { holder.mTextView.setText(mList.get(position)); holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked == true) { map.clear(); map.put(position, true); } else { map.remove(position); } if (!onBind) { notifyDataSetChanged(); } } }); onBind = true; if (map != null && map.containsKey(position)) { holder.mCheckBox.setChecked(true); } else { holder.mCheckBox.setChecked(false); } onBind = false;}
三.获取CheckBox勾选的位置
完整的适配器代码:
public class CheckBoxAdapter extends RecyclerView.Adapter<CheckBoxAdapter.ViewHolder> { private List<String> mList; private Context mContext; private Map<Integer, Boolean> map = new HashMap<>(); private boolean onBind; private int checkedPosition = -1; public CheckBoxAdapter(Context context, List<String> list) { this.mContext = context; this.mList = list; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.item_rcy_checkbox, parent, false); return new ViewHolder(view); } //得到当前选中的位置 public int getCheckedPosition() { return checkedPosition; } @Override public void onBindViewHolder(ViewHolder holder, final int position) { holder.mTextView.setText(mList.get(position)); holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked == true) { map.clear(); map.put(position, true); checkedPosition = position; } else { map.remove(position); if (map.size() == 0) { checkedPosition = -1; //-1 代表一个都未选择 } } if (!onBind) { notifyDataSetChanged(); } } }); onBind = true; if (map != null && map.containsKey(position)) { holder.mCheckBox.setChecked(true); } else { holder.mCheckBox.setChecked(false); } onBind = false; } @Override public int getItemCount() { return mList.size(); } class ViewHolder extends RecyclerView.ViewHolder { CheckBox mCheckBox; TextView mTextView; public ViewHolder(View itemView) { super(itemView); mCheckBox = (CheckBox) itemView.findViewById(R.id.checkbox); mTextView = (TextView) itemView.findViewById(R.id.textView); } }}
阅读全文
3 0
- RecyclerView中使用CheckBox勾选混乱问题解决以及单选功能的实现
- RecyclerView中使用CheckBox出现勾选混乱的解决方案
- RecyclerView中使用CheckBox出现勾选混乱的解决方案
- RecyclerView中使用CheckBox出现勾选混乱的解决方案
- 解决ListView中多选功能使用CheckBox勾选混乱问题
- RecyclerView中CheckBox显示混乱的解决办法
- ListView、RecyclerView CheckBox 单选实现,以及RecyclerView异步加载网络图片
- RecyclerView之CheckBox实现单选效果
- checkbox实现单选功能
- checkbox实现单选功能
- RecyclerView使用,item实现全选,反选,单选,计算checkbox选中的个数
- RecyclerView上放置CheckBox实现全选和单选,不选功能。
- android ListView中Checkbox实现单选,全选,全不选功能
- Android中Recyclerview使用9----Recyclerview的条目复用,出现CheckBox或者设置背景混乱问题
- 利用js实现checkbox的单选功能
- ListView 加checkBox实现 单选功能
- checkBox单选功能
- checkbox 单选功能
- 【PDF下载】双11技术峰会之阿里大规模数据计算与处理
- Problem A: 统计数字
- 域服务篇 02. 域服务配置 ❀ Windows Server 2016
- [NOIP模拟赛]相似字符串
- 使用行为树(Behavior Tree)实现游戏AI
- RecyclerView中使用CheckBox勾选混乱问题解决以及单选功能的实现
- 数据库的增删改查
- HttpClient
- BUAA OJ 94 双层汉诺塔
- linux定时任务的设置 crontab 配置指南
- Gossiping闲聊路由协议
- 二维数组中的查找、空格替换、从尾到头打印链表 --漫漫算法路 刷题篇
- 微信开发----群发接口
- python