Showing the current selection in a listview
As seen in the tablet version of gmail and google talk I am trying to show the current selection in a listview. I know this is not standard practice and should be avoided when necessary.in my program the listview is alway on the screen and the item clicked shows a new fragment to the right (similar to gmail and google talk).
To avoid the user from guessing what item has been selected I would like to show the current selection, I tried creating a selector but after it is clicked it changes back to the normal background.
how can I achieve this?
this is my selector 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>
Solution 1:
What Gmail and similar apps use is the activated
state, with an appropriate row layout. See:
- Setting Android Background & Persistence Menu Bar - Using attribute on older versions causes crash - Is there a theme /pattern approach?
- Change colour of activated list item background on Honeycomb
In a nutshell, you:
- Use a row layout with an activated background (e.g.,
android.R.layout.simple_list_item_activated_1
) - Use
setChoiceMode(ListView.CHOICE_MODE_SINGLE)
on yourListView
- "Check" the row that should be activated using
setItemChecked()
on yourListView
to enable the "activated" state and have the persistent highlight
Solution 2:
Your other option is to set the background of your custom list item to android:background="?android:attr/activatedBackgroundIndicator"
Solution 3:
If you use a custom layout for each row:
- create a selector with android:state_activated="true"
- apply it as the background of the custom layout.
an example of the selector drawable:
<?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>