在 BaseAdapter.getView() 中為各子 View (ImageView, TextView) 獨立設定 OnClickListener,可直接存取該行資料模型,邏輯封裝性最好。
public class MyAdapter extends BaseAdapter {
private final Context context;
private final List dataList;
public MyAdapter(Context context, List dataList) {
this.context = context;
this.dataList = dataList;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_layout, parent, false);
holder = new ViewHolder();
holder.icon = convertView.findViewById(R.id.iv_icon);
holder.title = convertView.findViewById(R.id.tv_title);
holder.desc = convertView.findViewById(R.id.tv_desc);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final ItemData item = dataList.get(position);
holder.title.setText(item.title);
holder.desc.setText(item.desc);
holder.icon.setImageResource(item.iconRes);
// 圖片點擊:顯示大圖 / 下載
holder.icon.setOnClickListener(v -> {
Toast.makeText(context, "圖片點擊: " + item.title, Toast.LENGTH_SHORT).show();
// 例如:啟動圖片瀏覽 Activity
// Intent intent = new Intent(context, ImageViewerActivity.class);
// intent.putExtra("url", item.imageUrl);
// context.startActivity(intent);
});
// 文字點擊:編輯 / 詳情
holder.title.setOnClickListener(v -> {
Toast.makeText(context, "標題點擊: " + item.title, Toast.LENGTH_SHORT).show();
});
holder.desc.setOnClickListener(v -> {
Toast.makeText(context, "描述點擊: " + item.desc, Toast.LENGTH_SHORT).show();
});
// 整行點擊 (可選)
convertView.setOnClickListener(v -> {
Toast.makeText(context, "整行點擊 position=" + position, Toast.LENGTH_SHORT).show();
});
return convertView;
}
static class ViewHolder {
ImageView icon;
TextView title, desc;
}
// ... 其他必要方法 getCount, getItem, getItemId
}
findViewById。android:focusable="true" 或 android:clickable="true",可能攔截點擊事件,導致 OnItemClickListener 不觸發。**建議子 View 不設定 focusable**,整行點擊交由 convertView.setOnClickListener 處理。public interface OnItemActionListener {
void onIconClick(ItemData item);
void onTitleClick(ItemData item);
}
// Adapter 建構子傳入 listener,點擊時呼叫 listener.onIconClick(item)
採用 **Adapter 內部綁定** 模式,是 Android ListView/RecyclerView 處理複合 Item 點擊的標準做法。