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.
If you can use a drawable for displaying listItem Highlighted then you should use following code:-
It works.
There is simple fully-XML solution, which worked for me. Firstly, define XML-drawable with selector code in which "normal" state will correspond to "selected unpressed" visual state of a list item, and state_pressed=true to "pressed" visual state. Example of file "custom_item_selector.xml", resembling Holo blue selection:
(may also set focused state there). Secondly, apply this xml-drawable as ListView's listSelector and set it's desired choiceMode:
That's all. It allows to define different visual states for "simply selected" and "pressed selected" items, for example making items brighter on press.
I faced similar problem. That's my solution:
First add custom list selector to your list view:
Inside listselector.xml:
And finally a drawable bg.xml with color of your highlight:
To summarize this post and maybe help someone else in future I suggest the answer :)
First, we need to create
res/drawable/list_item_background.xml
file with the following contents:Specify your drawable resources, of course. And you can also add other
<item>
elemens with different states likestate_pressed
,state_focused
etc.Then, we should set the
background
parameter to our custom list itemViewGroup
element (f.i.res/layout/list_item_layout.xml
) like this:The next step is modifying our custom
Adapter
class. Here is the following code fragment:Finally, we should call the
setSelectedIndex(position)
adapter's method inonItemClick(...)
method ofAdapterView.OnItemClickListener
.Now, we can be satisfied with proper list items highlighting :)
P.S. If we want to enable multiple choice mode on our list we'll just place the following string to our activity class where
listView
instance is kept:Thus, we'll get proper multiple items highlighting.
-- Hope this helps anyone :)
lv.setSelector(R.drawable.highlighter);
put a
highlighter.png
image in drawable foldersimplest way to highlight selected item in list view.
To expand on Shaiful's great solution, you might not get his to work in your situation.
If you are using have your code all in
public void onListItemClick(ListView l, View v, int index, long id)
, if you're using fragments and have to declare an interface instead of implementing OnListItemClickListener, or whatever is causing your IDE to generate errors, you might have to access variables and methods statically.And in Your_adapter:
Some other differences are that you don't have to initialize any variables as "0" or "-1" and notifyDataSetChanged() is called in your activity.
Once again, thanks for your solution @Shaiful. It certainly helped save me time trying to get what is default in iOS to work for Android, all while avoiding selector/item/focused/pressed/etc.