設置 android:cacheColorHint="@android:color/transparent" 後,ListView 單擊無橙色高亮,但長按項目仍出現橙色背景,需去除長按高亮。
通過 android:listSelector 屬性指定一個 StateListDrawable (selector),控制各狀態下的背景。
<?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>
<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 項目長按時的橙色背景高亮。