写在前面:
今天在Recyclerview中使用Switch控件时,遇到了一个以前没有遇过的问题——控件被复用,我点击了一个开关,发现滑动之后的其他行数的switch控件莫名被打开了,网上找了很多方法尝试了都没效果,于是修改了一个下午才解决了这个问题,以此记录下来,谨防二次踩坑!
解决思路:
创建一个list<boolean> isCheck ,对应的每一条数据默认初始化为false;
初始化:
注:适配器使用的是继承BaseQuickAdapter,implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.31'
private List<Boolean> isCheck; public void setList(List<SocketBean> list) { isCheck = new ArrayList<>(); if (list.size() != 0) { for (int i = 0; i < list.size(); i++) { if (list.get(i).isRun) { isCheck.add(true); } else { isCheck.add(false); } } } setNewData(list); }Convert 里面的实现:
if (isCheck.get(position)) { aSwitch.setChecked(true); } else { aSwitch.setChecked(false); }设置接口回调:
SwitchChangeListener mListener; public interface SwitchChangeListener { void check(boolean checked, int position); } public void setSwitchListener(SwitchChangeListener mListener) { this.mListener = mListener; }Switch 切换事件
aSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (!buttonView.isPressed()) { return; } if (mListener != null) { mListener.check(isChecked, helper.getLayoutPosition()); isCheck.set(helper.getLayoutPosition(), isChecked); notifyDataSetChanged(); } } });解决控件点击之后被复用的问题!