I have a list of albums (several hundred). When I touch the selected album I want to offer the user a choice of playing the whole album, or moving to its track ListView. No
add android:background="?activatedBackgroundIndicator
to list item's main layout similar to android.R.layout.simple_list_item_activated_2.xml
Quoted from http://android-developers.blogspot.de/2008/12/touch-mode.html
Imagine a simple application, ApiDemos for example, that shows a list of text items. The user can freely navigate through the list using the trackball but also, alternatively, scroll and fling the list using the touch screen. The issue in this scenario is how to handle the selection properly when the user manipulates the list through the touch screen.
In this case, if the user selects an item at the top of the list and then flings the list towards the bottom, what should happen to the selection? Should it remain on the item and scroll off the screen? What should happen if the user then decided to move the selection with the trackball? Or worse, what should happen if the user presses the trackball to act upon the currently selected item, which is not shown on screen anymore?
After careful consideration, we decided to remove the selection altogether, when the user manipulates the UI through the touch screen.
In touch mode, there is no focus and no selection. Any selected item in a list of in a grid becomes unselected as soon as the user enters touch mode. Similarly, any focused widgets become unfocused when the user enters touch mode. The image below illustrates what happens when the user touches a list after selecting an item with the trackball.
Implement your list with single choice mode: android:choiceMode=singleChoice
Just as the default android.R.layout.simple_list_item_single_choice
uses a RadioButton
to denote the selected choice, you can implement a custom highlight state or similar in your list item layout to respond to the choice changes. Methods like getCheckedItemPosition()
can be used by your application to determine which item the user currently has chosen, if necessary.
Hope that Helps!
Here's what I did :) - after major head whacking against wall.
For the adapter:
radioAdapter = new RadioAdapter(context, R.layout.row_layout, yourData);
For the row_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/radio_name"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:padding="10dp"
android:background="?android:attr/activatedBackgroundIndicator"
android:clickable="true"
android:text="SOME RADIO"
android:textColor="@color/Gray"
android:textSize="25dp" />
To set a default position to be highlighted just do this to your listView object:
radioTitleList.setItemChecked(defaultPosition, true);
If you want highlighting when you click on the list:
In your getView() in your custom list adapter add this before returning the view:
row.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
radioTitleList.setItemChecked(position, true);
// other stuff like navigating to a new activity etc
}
});
Other solution (mostly in XML)
1) set the choiceMode
of the ListView
to singleChoice
<ListView
android:choiceMode="singleChoice"
.../>
2) Items of the list must be a Checkable View and use a Color State List as Background
eg: album_item.xml
<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:background="@drawable/list_selector"
.../>
3) the background Color State (list_selector.xml
) defines the highlight color
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/green" android:state_checked="true"/>
<item android:drawable="@color/green" android:state_pressed="true"/>
</selector>
Maaalte is correct, in touch mode lists do not show the focus highlight on a current item since there is no current item in touch mode. Stateful selection like you're describing that persists while you interact with other parts of the UI is another matter though.
You can use CHOICE_MODE_SINGLE to express a stateful selection in a list. It will treat selection as a checked state. As long as the view that your adapter returns implements the Checkable interface, you can display the selected state however you choose. (Setting a background on the item view or otherwise. It does not actually need to show a check box widget.) You can then use the item checked methods of ListView to manipulate or determine the selection.