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

Android ExpandableListView 獲取 Child Item 點擊資料

     編輯:程式設計綜合問答

問題現象

設定 OnChildClickListener 後,點擊 Child Item 無法取得對應資料 (如 ID、名稱等)。

正確實作:在 Listener 內透過 Adapter 取得資料

ExpandableListView expandableListView = findViewById(R.id.expandable_list);
MyExpandableAdapter adapter = new MyExpandableAdapter(this, groupData, childData);
expandableListView.setAdapter(adapter);

expandableListView.setOnChildClickListener((parent, v, groupPosition, childPosition, id) -> {
    // 關鍵:透過 Adapter 取得該位置的資料物件
    ChildItem item = (ChildItem) adapter.getChild(groupPosition, childPosition);
    
    if (item != null) {
        String name = item.getName();
        long itemId = item.getId();
        Toast.makeText(this, "點擊: " + name + " (ID: " + itemId + ")", Toast.LENGTH_SHORT).show();
        
        // 業務邏輯:啟動詳情頁、更新 UI 等
        Intent intent = new Intent(this, DetailActivity.class);
        intent.putExtra("ITEM_ID", itemId);
        startActivity(intent);
    }
    return true; // true 表示已處理,不展開/摺疊群組
});

Adapter 必須正確實作 getChild()

public class MyExpandableAdapter extends BaseExpandableListAdapter {
    private List groups;
    private Map> childrenMap;
    
    @Override public Object getChild(int groupPosition, int childPosition) {
        GroupItem group = groups.get(groupPosition);
        return childrenMap.get(group).get(childPosition); // 回傳實際資料物件
    }
    
    @Override public long getChildId(int groupPosition, int childPosition) {
        return getChild(groupPosition, childPosition).hashCode(); // 或實際 ID
    }
    
    // ... 其他必要方法 getGroup, getChildrenCount, getView 等
}

替代方案:在 Child View 設 Tag

// 在 Adapter 的 getChildView 中
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
    View view = convertView != null ? convertView : inflater.inflate(R.layout.child_item, parent, false);
    ChildItem item = (ChildItem) getChild(groupPosition, childPosition);
    
    TextView nameTv = view.findViewById(R.id.child_name);
    nameTv.setText(item.getName());
    
    // 將完整資料物件存入 Tag
    view.setTag(item); 
    
    return view;
}

// Listener 中直接取得
expandableListView.setOnChildClickListener((parent, v, groupPos, childPos, id) -> {
    ChildItem item = (ChildItem) v.getTag(); // 直接從 View 取得
    // 處理 item...
    return true;
});

常見錯誤

  • 使用 getChildAtPosition():此方法不存在於 ExpandableListView
  • 混淆 groupPosition / childPosition:群組索引 vs 群組內子項索引
  • Adapter 回傳錯誤型別:getChild() 應回傳具體資料物件,而非 View 或 String
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved