I have a ListView that opens another activity when an item row is clicked via a onItemClick listener.
I would like that row to stay in its pressed state from the time it is clicked to the time the screen switches to a new activity. I think this would be a clearer experience for the user and you see this kind of thing with most buttons that open/close dialogs or switch activities.
I tried setting view.setPressed(true) in the onItemClick() listener but it seems to get called just a moment after the press state changed back to normal because it flickers slightly.
For example:
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
view.setPressed(true);
//start an activity
}
});
That code almost works except for the flicker (User presses the list item and it turns to its pressed state, then user lets go (completing the click) and it turns back to its normal state for a split second before turning back to the pressed state from the setPressed(true) call)
Any ideas?
Thanks
Edit: I should mention that I am using an xml drawable selector to define the normal, pressed, selected, etc states for the background of the list.
From inside an Adapter you can reference the view you want to change the state on. Say you have a ListView with a title and a star (ie. favorite star) and you want that to stay "selected/pressed" when touched. Override your getView and do something like:
And your ImageButton layout should reference a drawable like this:
You are using xml for selector. check whether you have correctly given the state.
While you set
view.setPressed(true)
it will use the drawable that is set for the stateandroid:state_pressed="true"
likeDo not use the selector XML. Instead change the list item images manually. This way you will be able to control the duration of a particular image
In this example the background is changed after the button is pressed in a list item. http://androidforbeginners.blogspot.com/2010/03/clicking-buttons-in-listview-row.html
You can do a similar thing in onItemSelected() by manipulating View which has been passed to this call. Usually the view passed is a LinearLayout which contains children views such as textView.
Have you already tried to use unscheduleDrawable in combination with drawableStateChanged
So you could maybe listen if the state changed and then immediately unschedule and set it back to pressed.
Maybe there isn't flickering anymore.
I had the exact same problem to much frustration!
It is, however, easily solved by substituting
state_pressed
withstate_selected
. The pressed state will still change rapidly beforeonItemClick()
is called, but since your theme does not depend onstate_pressed
the flicker won't be visible. Once inonItemClick()
you setstate_selected
and the item will stay selected without any flicker occurring.Here's my selector:
And my onListItemClick(...):