匿名內部類 OnClickListener 引用區域變數 groupPosition 時,編譯器要求變數為 final(Java 8+ 隱含 final),但若變數需在迴圈中變化則無法滿足。
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,構造函數傳入當時快照值。final int pos = groupPosition; // 有效 final
childImage.setOnClickListener(v -> {
// 使用 pos
});
但迴圈中需為每次迭代建立新變數,較繁瑣,首選自定義類別。