Recyclerview中Switch 被复用的解决方法

    技术2022-07-15  44

    写在前面:

    今天在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(); } } });

    解决控件点击之后被复用的问题!

    Processed: 0.013, SQL: 9