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

Android 匿名內部類 OnItemClickListener 結構解析

     編輯:程式設計疑難解答

原始碼

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();
    }
});

結構拆解

  1. new OnItemClickListener() { ... } — 建立實作 OnItemClickListener 介面的 匿名內部類 實例。
  2. public void onItemClick(...) — 實作介面唯一抽象方法。
  3. setOnItemClickListener( ... ) — 將該實例傳遞給 ListView,ListView 內部持有引用,項目被點擊時回呼。
  4. 結尾符號 }); — 依序對應:} 結束類別主體,) 結束方法呼叫參數,; 結束陳述式。

等價的具名類別寫法

// 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),導致記憶體洩漏。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved