Отображение текущего выбора в списке
Как видно из версии планшета gmail и google talk, я пытаюсь показать текущий выбор в списке. Я знаю, что это не стандартная практика, и ее следует избегать, когда это необходимо. В моей программе список всегда присутствует на экране, а нажатый элемент показывает новый фрагмент справа (аналогично gmail и google talk).
Чтобы пользователь не угадал, какой элемент был выбран, я хотел бы показать текущий выбор, я попытался создать селектор, но после его нажатия он возвращается обратно к нормальному фону.
как я могу это достичь?
это мой селектор xml
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/list_item_bg2" android:state_pressed="false" android:state_selected="false"
android:state_focused="false"/>
<item android:drawable="@drawable/list_item_selected_bg2" android:state_pressed="true"/>
<item android:drawable="@drawable/list_item_selected_bg2" android:state_pressed="false" android:state_focused="false"
android:state_selected="true" android:state_checked="false"/>
<item android:drawable="@drawable/list_item_selected_bg2" android:state_pressed="false" android:state_focused="true"
android:state_selected="false"/>
<item android:drawable="@drawable/list_item_selected_bg2" android:state_pressed="false" android:state_focused="false"
android:state_selected="false" android:state_checked="true"/>
<item android:drawable="@drawable/list_item_selected_bg2" android:state_pressed="true" android:state_focused="true"
android:state_selected="true" android:state_checked="true"/>
<item android:drawable="@drawable/list_item_selected_bg2" android:state_pressed="true"/>
</selector>
Ответы
Ответ 1
В Gmail и подобных приложениях используется состояние activated
с соответствующим расположением строк. См:
В двух словах вы:
- Используйте макет строки с активированным фоном (например,
android.R.layout.simple_list_item_activated_1
)
- Используйте
setChoiceMode(ListView.CHOICE_MODE_SINGLE)
на ListView
- "Проверьте" строку, которая должна быть активирована с помощью
setItemChecked()
на вашем ListView
, чтобы включить "активированное" состояние и иметь постоянную подсветку
Ответ 2
Другой вариант - установить фон вашего настраиваемого элемента списка на андроид: фон = "? android: attr/activatedBackgroundIndicator"
Ответ 3
Если вы используете пользовательский макет для каждой строки:
- создать селектор с андроид: state_activated = "true"
- примените его как фон пользовательского макета.
пример извлекаемого селектора:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:exitFadeDuration="@android:integer/config_shortAnimTime">
<item android:state_activated="true" android:drawable="@color/android_green" />
<item android:drawable="@android:color/transparent" />
</selector>
Ответ 4
Что сработало для меня
-
переопределяет глобальный стиль ListView в вашей теме
<item name="android:listViewStyle">@style/MyListView</item>
-
Определите свой стиль
<style name="MyListView" parent="@android:style/Widget.ListView">
<item name="android:listSelector">@drawable/listview_background_selector</item>
</style>
-
определить селектор listview_background_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:enterFadeDuration="@android:integer/config_mediumAnimTime" android:exitFadeDuration="@android:integer/config_mediumAnimTime">
<item android:drawable="@color/ListViewBackGroundColorPressed" android:state_activated="true" />
</selector>
-
установите фон в вашем представлении list-item-layout
android:background="?android:attr/activatedBackgroundIndicator"