首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android ExpandableListView + CheckBox 實現多選聯動:父子項勾選邏輯完整示例

     編輯:程式設計綜合問答

需求:ExpandableListView 顯示部門(組)與成員(子),實現「選中部門 → 全選成員」「全選成員 → 自動勾選部門」「部分選中 → 部門未勾選」的雙向聯動。

核心邏輯

  1. 數據模型:DepartmentEntity、EmployeeEntity 各含 isChecked 字段。
  2. 父項點擊:遍歷該組所有子項,設置 isChecked 並 notifyDataSetChanged()。
  3. 子項點擊:更新自身狀態後,統計同組所有子項勾選數;若等於總數 → 勾選父項,否則取消父項。
  4. 避免在 getView 中創建 View:直接操作數據模型,交由 Adapter 刷新 UI,防止重複 inflate 導致狀態錯亂。

關鍵代碼片段

// 父項點擊
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。
  • 勾選狀態持久化至 ViewModel/Room,避免配置變更丟失。

完整示例可參考:CSDN 博客。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved