Недавно я тоже столкнулся с этой проблемой и нашел решение, проанализировав исходный код Android.
Вам необходимо удалить атрибуты android:state_selected="true"
, так как проверка этого состояния не требуется. Как только элемент списка теряет фокус, он также принимает значение selected = false. Поскольку focus=false & selected=true
никогда не произойдет, ваши первые 2 <items>
в селекторе никогда не будут отображаться.
Думайте о касании как о щелчке мышью с событиями onPressDown и onPressUp.
Так что ваш новый файл selector.xml должен выглядеть примерно так, чтобы избежать мерцания:
<!-- {comment copied directly from Android source code}
Even though these two point to the same resource, have two states
so the drawable will invalidate itself when coming out of pressed state.
-->
<item android:state_pressed="true" android:state_focused="true"
android:drawable="@drawable/timeline_selected_rect"/>
<item android:state_pressed="true" android:state_focused="false"
android:drawable="@drawable/timeline_selected_rect" />
<item android:state_focused="true"
android:drawable="@drawable/timeline_selected_rect" />
<item android:state_window_focused="false"
android:drawable="@android:color/transparent" />
Кроме того, вам следует серьезно подумать о создании отдельного объекта рисования для нажатого состояния, чтобы дать вам немного визуальной обратной связи. Всегда приятнее видеть, что «что-то происходит» при взаимодействии с пользовательским интерфейсом; независимо от того, рисует ли кнопка в состоянии «вниз», когда она нажата, или слегка меняет цвет при нажатии на элемент списка, визуальная обратная связь является хорошей практикой.