So I have an activity with 2 ListView
widgets, when you select a value in the first one, the second is populated with values related to the selection in the first ListView
. This mechanic works without a problem, but now I want the user choices to stay highlighted. I've read a good ammount of question related to this topic and it seems there is a myriad of ways one can accomplish this but after trying about 4-5 of em' I still can't get it to work.
I've got it working on the second ListView
using the android:listSelector="#CCCCCC"
XML Attribute, but this seems to be wiped clean once a OnItemClickListener
is introduced into the mix (like the one I use on my first ListView
).
So far here's what I've got:
Custom OnItemClickListener
I found browsing various answer regarding this topic (slightly modified it in order for it to load my info the second ListView):
private class ItemHighlighterListener implements OnItemClickListener {
private View oldSelection = null;
public void clearSelection() {
if(oldSelection != null) {
oldSelection.setBackgroundColor(android.R.color.transparent);
}
}
public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
clearSelection();
oldSelection = view;
view.setBackgroundDrawable(view.getContext().getResources().getDrawable(R.drawable.list_selector));
loadClubs(mXMLPortalOptions.getRegion(pos).getId());
mClubList.setAdapter(new ArrayAdapter<String>(getApplicationContext(), R.layout.list_item_white, mClubs));
}
}
Here's my list_selector.xml
file :
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true"><shape>
<solid android:color="#CCCCCC" />
</shape></item>
<item android:state_selected="false"><shape>
<solid android:color="#FFFFFF" />
</shape></item>
</selector>
The method (OnItemClick) is called and executed, but the background of my ListItem
stays the same color :/
I can't believe that this simple task has proven so complicated.
If I have omitted code that could be useful or if my question is lacking details, feel free to point that out and I'll do my best to explain myself.
Put a position variable for selected item. Change the position in
onItemClicked()
method. Check the selected position in List Adapter insidegetView()
and set the background for the selected item.Now set the selectedIndex variable when a list item clicked.
I think the best and easiest solution is this. You don't need to set any
android:listSelector
on the ListView itself or do any changes to the adapter. You don't even need to call anysetSelection(position)
in theOnItemClickListener
as it is handled automatically.Set to your ListView:
Set background of the list item itself:
That's it.
This way you'll get default system behavior. That's how it is done in the default
android.R.layout.simple_list_item_activated_1
layout.To keep the list items(multiple selection) highlighted, when clicked(activated), please follow the steps.
1. Set background to list item layout as drawable.
2. drawable selector
3. Listview set multiple choice mode
getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
When Pressed:
Below image shows, when user selected multiple list items.
When Activated:
I was looking for it two weeks ago and the result is that is not possible with a drawable selector. For more info read this post in Android Developers Blog: Touch Mode
In resume: Only when your finger are on the screen, item is selected.
Other possibility is save which item is selected in a var and paint different using your custom adapter like Shaiful says.
// And see the output.