for (int j = 0; j < 5; j++) {
ImageView image = new ImageView(this);
image.setId(j + 1);
// ...
image.setOnClickListener(clickImageListener);
}
private OnClickListener clickImageListener = new OnClickListener() {
public void onClick(View v) {
imageId = image.getId(); // 錯誤:image 是循環最後一個 ImageView 的引用
// 所有點擊都獲取最後一個 ID
}
};
匿名類捕獲的是 image 變量的引用,循環結束後 image 指向最後一個創建的 ImageView,所有監聽器共享同一引用。
private OnClickListener clickImageListener = new OnClickListener() {
@Override
public void onClick(View v) {
// 關鍵:v 就是被點擊的那個 ImageView
int clickedId = v.getId();
// 或強制轉型獲取 ImageView 特有屬性
ImageView clickedImage = (ImageView) v;
Intent intent = new Intent(v.getContext(), FullImageActivity.class);
intent.putExtra("image_id", clickedId);
startActivity(intent);
}
};
for (int j = 0; j < 5; j++) {
ImageView image = new ImageView(this);
image.setId(j + 1);
// 綁定業務 ID (如圖片 URL、數據庫 ID)
image.setTag(R.id.tag_image_url, imageUrls.get(j));
// 或用 setTag 直接存對象
image.setTag(new ImageData(url, title, id));
image.setOnClickListener(v -> {
ImageData data = (ImageData) v.getTag();
Intent intent = new Intent(v.getContext(), FullImageActivity.class);
intent.putExtra("image_data", data);
startActivity(intent);
});
container.addView(image);
}
for (int j = 0; j < 5; j++) {
final int index = j; // effectively final
ImageView image = new ImageView(this);
image.setOnClickListener(v -> {
// 捕獲 index 或直接用 v.getId()
int id = v.getId();
handleClick(id);
});
}
v.getId()、v.getTag()、(ImageView)vholder.itemView.setOnClickListener(v -> { int pos = holder.getAdapterPosition(); })