在 BaseAdapter.getView() 中調用 convertView.setSelected(true) 試圖高亮某項,卻發現無效。這是因為 ListView/GridView 的選中狀態由控件內部管理,不由單項 View 的 selected 屬性決定。
AbsListView 通過 CheckForKeyLongPress、setSelectionInt 等內部邏輯維護 mSelectedPosition / mSelectedRowId。selected 狀態在 dispatchDraw / drawSelector 階段由 ListView 根據位置動態計算並臨時應用,**不持久化在 View 對象上**。convertView.setSelected(true) 會在下一次佈局/繪製時被覆蓋。// 在 Activity/Fragment 中持有 GridView 引用 gv
gv.setSelection(position) // 設置選中位置(觸發選中狀態視覺更新)
gv.setItemChecked(position, true) // 若啟用 CHOICE_MODE_SINGLE/MULTIPLE
gv.smoothScrollToPosition(position) // 可選:滾動使可見
確保項目佈局根 View 設置 android:background="@drawable/selector_item",selector 定義:
<selector xmlns:android="...">
<item android:state_selected="true" android:drawable="@color/highlight" />
<item android:state_pressed="true" android:drawable="@color/pressed" />
<item android:drawable="@android:color/transparent" />
</selector>
關鍵:項目佈局根 View 必須是 ViewGroup 或設置了背景的 View,且 不可** 設置 android:clickable="true" 干攔截選中事件傳遞(除非自行處理)。
gridview.setSelection(position) 仍無反應的可能原因onCreate 前數據未綁定),需在 post() 或 OnGlobalLayoutListener 中執行。gv.requestFocus()。gv.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE)。