Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Force a ListView item to stay "pressed" after being clicked?

Tags:

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.

like image 540
cottonBallPaws Avatar asked Feb 01 '11 07:02

cottonBallPaws


People also ask

Which method is used to obtain the selected option from a ListView?

To get which item was selected, there is a method of the ListView called getItemAtPosition.

What is the use of ListView explain list view with example?

Android ListView is a ViewGroup that is used to display the list of items in multiple rows and contains an adapter that automatically inserts the items into the list. The main purpose of the adapter is to fetch data from an array or database and insert each item that placed into the list for the desired result.

How do I resize a list view?

If you only want to set width and height of listview. you can set it by right clicking on listview in xml and select set width / set height and set it, for ex. 20dp, 50 dp etc..


2 Answers

I had the exact same problem to much frustration!

It is, however, easily solved by substituting state_pressed with state_selected. The pressed state will still change rapidly before onItemClick() is called, but since your theme does not depend on state_pressed the flicker won't be visible. Once in onItemClick() you set state_selected and the item will stay selected without any flicker occurring.

Here's my selector:

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android">     <!-- Selected Item -->     <item android:state_selected="true"         android:drawable="@color/list_pressed" />      <!-- Default Item -->     <item android:state_selected="false"         android:drawable="@android:color/list_default" /> </selector> 

And my onListItemClick(...):

@Override protected void onListItemClick(ListView l, View v, int position, long id) {     super.onListItemClick(l, v, position, id);     v.setSelected(true);     //TODO: add further actions here } 
like image 60
Rudolf Meijering Avatar answered Sep 30 '22 19:09

Rudolf Meijering


The best way you can do this before Android 3.0 is to use a custom state in a custom view or to change your view's background color from the adapter. Starting with Android 3.0 you can use the new state_activated to keep a list item selected.

like image 31
Romain Guy Avatar answered Sep 30 '22 20:09

Romain Guy