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

Android onClick 內部類使用區域變數:改用自定義 Listener 持有參數

     編輯:程式設計綜合問答

匿名內部類 OnClickListener 引用區域變數 groupPosition 時,編譯器要求變數為 final(Java 8+ 隱含 final),但若變數需在迴圈中變化則無法滿足。

解法:自定義 Listener 類別封裝參數

class MyClickListener implements View.OnClickListener {
    private final int groupPosition;
    private final int childPosition;
    public MyClickListener(int groupPosition, int childPosition) {
        this.groupPosition = groupPosition;
        this.childPosition = childPosition;
    }
    @Override
    public void onClick(View v) {
        // 直接使用 this.groupPosition, this.childPosition
    }
}

// 綁定時
childImage.setOnClickListener(new MyClickListener(groupPosition, childPosition));

優勢

  • 無需 final,構造函數傳入當時快照值。
  • 程式碼結構清晰,易於單元測試與複用。
  • 避免匿名類持有外部類引用導致記憶體洩漏。

替代:Java 8 Lambda + final 區域變數

final int pos = groupPosition; // 有效 final
childImage.setOnClickListener(v -> {
    // 使用 pos
});

但迴圈中需為每次迭代建立新變數,較繁瑣,首選自定義類別。

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