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

Android ListView Selector 不生效:狀態順序與 drawable 狀態屬性檢查

     編輯:程式設計綜合問答

現象

設置 android:listSelector="@drawable/list_selector",點擊項目有效果,但按下前無默認背景,或狀態切換異常。

Selector XML 常見錯誤:項目順序




    
    
    
    

規則:Selector 從上到下匹配,第一個匹配的項目生效。默認項目 (無狀態限制) 必須放在最後!

修正後的 Selector




    
    
    
    
    
    
    
    

ListView 關鍵屬性檢查



    android:focusable="true"               
    android:choiceMode="singleChoice"      
    android:divider="@null"                
    android:dividerHeight="0dp" />

項目佈局干擾排查

若項目佈局根視圖設置了 android:background,會覆蓋 Selector。解決:

  • 項目根佈局 不設置 background
  • 或設置 android:background="?android:attr/selectableItemBackground" 使用主題默認選擇器
  • 或項目根佈局 android:background="@null"

現代替代:RecyclerView + ItemDecoration


// RecyclerView 無 listSelector,用 ItemDecoration 繪制選中/按下態
recyclerView.addItemDecoration(new ItemDecoration() {
    @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        // 繪制選中項目背景
    }
});

// 或更簡單:項目佈局使用前景屬性 (API 23+)

總結檢查清單

  1. ✅ Selector XML:具體狀態在前,默認項目 android:drawable="..." 在最後
  2. ✅ ListView:android:listSelector 引用正確、drawSelectorOnTop="true"
  3. ✅ 項目佈局:根視圖無背景或用 selectableItemBackground
  4. ✅ 選擇模式:choiceMode 設置觸發 state_selected
  5. ✅ Drawable 資源:@drawable/xxx 存在、非 9-patch 導致拉伸異常
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved