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

Android ListView 長按項目背景色去除方案

     編輯:程式設計疑難解答

問題現象

設置 android:cacheColorHint="@android:color/transparent" 後,ListView 單擊無橙色高亮,但長按項目仍出現橙色背景,需去除長按高亮。

解決方案:自定義 Selector

通過 android:listSelector 屬性指定一個 StateListDrawable (selector),控制各狀態下的背景。

步驟 1:創建 drawable/selector_shape_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="https://schemas.android.com/apk/res/android">
    <!-- 長按狀態:透明背景 -->
    <item android:state_pressed="true" android:drawable="@android:color/transparent" />
    <item android:state_focused="true" android:drawable="@android:color/transparent" />
    <item android:state_selected="true" android:drawable="@android:color/transparent" />
    <!-- 默認狀態:透明 -->
    <item android:drawable="@android:color/transparent" />
</selector>

步驟 2:在 ListView 中引用

<ListView
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:listSelector="@drawable/selector_shape_list_item"
    android:cacheColorHint="@android:color/transparent" />

原理解析

  • android:listSelector 控制項目在 按下、聚焦、選中、長按 等狀態下的背景繪製。
  • 長按觸發 state_pressed="true" 和 state_focused="true",將對應項目設置為透明即可去除高亮。
  • cacheColorHint 僅影響滾動時的背景繪製優化,不影響長按選中狀態。

進階:保留點擊反饋但去除長按高亮

若需保留單擊的 ripple/波紋效果,可在 selector 中區分狀態:

<selector xmlns:android="https://schemas.android.com/apk/res/android">
    <item android:state_long_clickable="true" android:state_pressed="true" android:drawable="@android:color/transparent" />
    <item android:state_pressed="true" android:drawable="@drawable/ripple_effect" />
    <item android:drawable="@android:color/transparent" />
</selector>

注意:state_long_clickable 需 API 21+,低版本可通過自定義 OnItemLongClickListener 返回 true 消費事件並手動控制背景。

總結

通過 android:listSelector="@drawable/selector_shape_list_item" 指定全透明 selector,徹底去除 ListView 項目長按時的橙色背景高亮。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved