Android Studio中RecyclerView删除选中条目后Checkbox异常勾选问题
问题修复方案
你对问题的定位完全正确,核心原因是使用动态变化的条目位置position作为SharedPreferences的存储key,条目删除后列表整体偏移,导致key和实际任务的对应关系完全错乱。按照以下步骤修改即可修复:
1. 前置准备:确保Task类有唯一标识
给你的Task实体类添加全局唯一的主键字段(一般使用ViewModel做删除操作时,底层已经有Room等数据库存储,Task本身就有主键id,比如int taskId,配套对应的get方法public int getId()即可),该id不会随列表位置变化而改变。
2. 修改Adapter中Checkbox状态存储逻辑
把bind2方法里所有用position作为存储key的逻辑,替换为用Task的唯一id作为key,修改后的bind2代码如下:
public void bind2(Task task){ // 先清除之前的点击监听器,避免Holder复用时回调错乱 checkbox.setOnClickListener(null); // 用任务唯一id作为存储key,不会随列表位置变化 String spKey = "checkbox_" + task.getId(); // 读取对应任务的勾选状态 boolean cb = PreferenceManager.getDefaultSharedPreferences(checkbox.getContext()) .getBoolean(spKey, false); checkbox.setChecked(cb); checkbox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { boolean isChecked = checkbox.isChecked(); PreferenceManager.getDefaultSharedPreferences(checkbox.getContext()).edit() .putBoolean(spKey, isChecked) .apply(); if(isChecked) { Toast.makeText(checkbox.getContext(), "Way to go! Now swipe to delete", Toast.LENGTH_LONG).show(); } } }); }
3. 修改删除逻辑,同步清理冗余的状态存储
删除任务时,同步把SharedPreferences里对应这个任务的勾选状态也清除,避免无用数据残留,修改HomeFragment里的删除逻辑:
.setPositiveButton("Delete", ((dialog, which) -> { Task toDelete = adapter.getTaskAt(viewHolder.getAdapterPosition()); // 先删除SP里对应的勾选状态 String spKey = "checkbox_" + toDelete.getId(); PreferenceManager.getDefaultSharedPreferences(requireContext()).edit() .remove(spKey) .apply(); // 再执行任务删除操作 taskViewmodel.delete(toDelete); }))
额外优化建议(可选)
你当前Adapter里的tasks、listener、adapter都被声明为static,会带来内存泄漏风险,也不符合RecyclerView.Adapter的设计规范,建议去掉这三个变量的static修饰符。
内容的提问来源于stack exchange,提问作者Harshitha
相关产品推荐
相关产品推荐

