如何让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
相关产品推荐
相关产品推荐

