首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android GridView convertView.setSelected(true) 無效的原因與正確選中實現

     編輯:程式設計綜合問答

GridView 項目選中狀態設置失效:機制誤解與正確 API

在 BaseAdapter.getView() 中調用 convertView.setSelected(true) 試圖高亮某項,卻發現無效。這是因為 ListView/GridView 的選中狀態由控件內部管理,不由單項 View 的 selected 屬性決定。

為什麼 setSelected 無效?

  • AbsListView 通過 CheckForKeyLongPress、setSelectionInt 等內部邏輯維護 mSelectedPosition / mSelectedRowId。
  • 項目 View 的 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) // 可選:滾動使可見

Selector 背景配置要點

確保項目佈局根 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) 仍無反應的可能原因

  1. 調用時機過早(onCreate 前數據未綁定),需在 post() 或 OnGlobalLayoutListener 中執行。
  2. GridView 未獲取焦點,調用前 gv.requestFocus()。
  3. 選擇模式未啟用:gv.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved