設定 OnChildClickListener 後,點擊 Child Item 無法取得對應資料 (如 ID、名稱等)。
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 表示已處理,不展開/摺疊群組
});
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 等
}
// 在 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():此方法不存在於 ExpandableListViewgetChild() 應回傳具體資料物件,而非 View 或 String