需求:ExpandableListView 顯示部門(組)與成員(子),實現「選中部門 → 全選成員」「全選成員 → 自動勾選部門」「部分選中 → 部門未勾選」的雙向聯動。
DepartmentEntity、EmployeeEntity 各含 isChecked 字段。isChecked 並 notifyDataSetChanged()。// 父項點擊
parentCB.setOnClickListener(v -> {
boolean checked = ((CheckBox)v).isChecked();
List<EmployeeEntity> children = map.get(parentList.get(groupPosition).getId());
for (EmployeeEntity e : children) e.setIsChecked(checked);
parentList.get(groupPosition).setIsChecked(checked);
notifyDataSetChanged();
});
// 子項點擊
childCB.setOnClickListener(v -> {
boolean checked = ((CheckBox)v).isChecked();
employee.setIsChecked(checked);
// 統計同組勾選數
long cnt = children.stream().filter(EmployeeEntity::isChecked).count();
parentList.get(groupPosition).setIsChecked(cnt == children.size());
notifyDataSetChanged();
});
SparseBooleanArray 記錄選中狀態,減少實體類字段。RecyclerView + Groupie 或 Epoxy 替代 ExpandableListView。完整示例可參考:CSDN 博客。