原始碼
tripListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) {
Toast.makeText(ListViewExample2.this,
"您選擇的是" + list.get(position).get("name").toString(),
Toast.LENGTH_SHORT).show();
}
});
結構拆解
- new OnItemClickListener() { ... } — 建立實作
OnItemClickListener 介面的 匿名內部類 實例。
- public void onItemClick(...) — 實作介面唯一抽象方法。
- setOnItemClickListener( ... ) — 將該實例傳遞給 ListView,ListView 內部持有引用,項目被點擊時回呼。
- 結尾符號
}); — 依序對應:} 結束類別主體,) 結束方法呼叫參數,; 結束陳述式。
等價的具名類別寫法
// 1. 定義具名類別
private class MyItemClickListener implements AdapterView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(ListViewExample2.this,
"選擇: " + list.get(position).get("name"), Toast.LENGTH_SHORT).show();
}
}
// 2. 使用
tripListView.setOnItemClickListener(new MyItemClickListener());
優缺點比較
| 寫法 | 優點 | 缺點 |
| 匿名內部類 | 就地定義、程式碼緊湊 | 持有外部類引用易洩漏、難以重用、除錯堆疊難讀 |
| 具名內部類 | 可重用、堆疊可讀、可獨立測試 | 稍顯冗長 |
| Lambda (Java 8+) | 極簡潔、無 this 洩漏風險 | 需介面為函數式介面 (單一抽象方法) |
Lambda 簡化版 (API 24+ / 專案啟用 desugaring)
tripListView.setOnItemClickListener((parent, view, position, id) ->
Toast.makeText(this, "選擇: " + list.get(position).get("name"), Toast.LENGTH_SHORT).show()
);
最佳實踐
- 簡單邏輯用 Lambda;複雜邏輯用具名類別或
View.OnClickListener 實作於 Activity/Fragment。
- 避免在匿名類別中持有大型物件引用(如 Context、Bitmap),導致記憶體洩漏。