You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:36:04