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

如何让Dialog中RecyclerView的Checkbox仅影响父RecyclerView当前行?

解决父RecyclerView条目Dialog内Checkbox状态同步的问题

问题场景

父RecyclerView的每个条目包含按钮,点击按钮弹出带RecyclerView的Dialog,Dialog内列表项通过API动态加载Checkbox。勾选某一行Dialog的Checkbox后,所有行Dialog的Checkbox会同步勾选,无法保持状态独立。

核心问题与解决步骤

1. 修复ModelSmDayPlan共用活动列表引用的问题

在DayPlannerActivity的parseDayPlanData方法中,所有ModelSmDayPlan对象复用了同一个modelSmActivities引用,导致数据共享,这是状态同步的根本原因。

解决代码示例:
错误写法(共用同一列表):

List<ModelSmActivity> sharedActivities = new ArrayList<>();
for (DayPlanDto dto : dayPlanDtos) {
    ModelSmDayPlan plan = new ModelSmDayPlan();
    plan.setActivities(sharedActivities); // 所有计划共用同一个列表
    mDayPlanList.add(plan);
}

修改为每个计划创建独立列表:

for (DayPlanDto dto : dayPlanDtos) {
    ModelSmDayPlan plan = new ModelSmDayPlan();
    // 为每个计划初始化独立的活动列表
    plan.setActivities(new ArrayList<>());
    mDayPlanList.add(plan);
}

从API加载活动数据时,要将数据添加到对应ModelSmDayPlan的专属列表中,而非统一存入共享列表。

2. 修复Dialog Adapter错误使用父列表索引的问题

AdapterSmActivity的onCheckedChanged方法误用holder.getAdapterPosition()作为父列表索引,该方法返回的是Dialog内RecyclerView的局部位置,而非父RecyclerView的行位置,导致更新时操作了错误的父条目数据。

解决代码示例:

  • 在父RecyclerView的Adapter中,打开Dialog时传入父条目的索引:
// 父Adapter的按钮点击事件
holder.btnOpenDialog.setOnClickListener(v -> {
    int parentPos = holder.getAdapterPosition();
    ModelSmDayPlan currentPlan = mDayPlanList.get(parentPos);
    
    // 创建Dialog的Adapter时,传入父位置和当前计划的独立活动列表
    AdapterSmActivity dialogAdapter = new AdapterSmActivity(currentPlan.getActivities(), parentPos);
    
    // 初始化Dialog、配置RecyclerView并设置adapter...
});
  • 在AdapterSmActivity中保存父索引,用于状态更新:
public class AdapterSmActivity extends RecyclerView.Adapter<AdapterSmActivity.ViewHolder> {
    private List<ModelSmActivity> mActivityList;
    private int mParentPosition; // 父RecyclerView的当前行索引

    public AdapterSmActivity(List<ModelSmActivity> activityList, int parentPosition) {
        mActivityList = activityList;
        mParentPosition = parentPosition;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        ModelSmActivity activity = mActivityList.get(position);
        holder.cbActivity.setChecked(activity.isChecked());
        
        holder.cbActivity.setOnCheckedChangeListener((buttonView, isChecked) -> {
            // 更新当前活动的勾选状态
            activity.setChecked(isChecked);
            // 可通过接口回调通知Activity更新父列表数据,或直接操作对应父条目
            // 例如:mCallback.onActivityChecked(mParentPosition, position, isChecked);
        });
    }

    // ViewHolder及其他方法...
}

额外注意事项

确保每个ModelSmActivity实例也是独立的,不要在不同父条目中复用同一个对象,避免状态意外共享。


内容的提问来源于stack exchange,提问作者Deepjyoty nath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:42:02