| 維度 | OnItemClickListener (單擊) | OnItemSelectedListener (選中) |
|---|---|---|
| 觸發動作 | 手指按下 → 不移動超出項目範圍 → 抬起 | 鍵盤/軌跡球/方向鍵導航聚焦到該項,或調用 setSelection() |
| 適用設備 | 觸摸屏為主 | 非觸摸設備(TV、手柄、鍵盤操作) |
| 視覺反饋 | 通常配合 selector 背景顯示按下態 | 項目獲得焦點時持續高亮(state_focused) |
| 典型場景 | 手機 App 列表進入詳情頁 | Android TV 應用、車機系統、鍵盤操作的工業平板 |
| API | setOnItemClickListener | setOnItemSelectedListener |
很多初學者以為「手指按住不放」算選中,實際上:
itemsCanFocus=false)。setSelection(int position) 程序化設置,或連接外接鍵盤/手柄時,才會觸發 OnItemSelectedListener。在 AbsListView 中:
// 點擊檢測邏輯簡化
if (mTouchMode == TOUCH_MODE_DOWN) {
// 手指未移動出項目矩形區域
if (pointInView(ev.getX(), ev.getY(), child)) {
performItemClick(child, position, id); // 觸發 OnItemClickListener
}
}
// 選中/焦點邏輯
public void setSelection(int position) {
// ... 更新 mSelectedPosition, requestFocus, invalidate ...
// 觸發 OnItemSelectedListener.onItemSelected()
}
OnItemSelectedListener 並配合 android:focusable="true"、android:focusableInTouchMode="true",提供清晰的焦點高亮樣式(state_focused)。RecyclerView 移除了 OnItemClickListener,需自行在 ViewHolder.itemView.setOnClickListener 中回調;選中邏輯同理,需配合 RecyclerView.setOnItemTouchListener 或焦點搜索機制。單擊 = 觸摸確認動作(手指按下抬起不偏移);選中 = 焦點移動結果(鍵盤/手柄/程序導航)。針對目標設備選擇正確的監聽器,是打造優質交互體驗的基礎。