Android listview remember selection and set default selection
Oct 28, 2012
From an iOS developer’s perspective, I find that it is extremely hard to apply features like “set default selection when starting” and “remember selection status after user clicked row” to ListView.
So let’s start with “remember selection” first.The problem is that even if you know that
you can use selector xml to define highlight/pressed/focus style.But that style will not
be kept after user clicked that row. For instance, I have a highlighting selector xml (list_selector.xml under res/drawable folder) like this (but you may have other fields need to highlight like text color of textview in row):
and list_selector_pressed.xml which defined the highlighting style–set the background color
to a gray color :
So as @David Hedlund suggested:
Rather, assign an OnItemClickListener, and have it store away the id of the selected item into some variable.
you need to create a instance variable on top of your class:
then go to
Pretty simple: we check if currentSelectedView is null or current clicked view or not. we first to unhighlight any style by calling method unhighlightCurrentRow(currentSelectedView)—you may wonder why we pass instant variable currentSelectedView as parameter, I will explain it later. Then we assign view to currentSelectedView and highlight current row; so that the style will persist after user’s clicking is done.
Aha, that’s it. That is how we implement “remember selection” for list view. As you see,
we have to duplicate the codes for styling both in xml and java code–pretty stupid :(
Next about “set default selection”. You may think that you can do this
in onCreate() in activity or onActivityCreated() in fragment.
But if you run it , you will get NullPointer exception and why ?
because at this time, the listview is not rendered yet and Android doesn’t like iOS which have viewWillAppear. SO you have to create an instant variable to remember whether it is first time to render listview cell and in onListItemClick to unset that variable:
So under currentSelectedView declaration:
then add methods : suppose we want to highlight the first row in list view:
Pretty simple.
But you need to make some changes in onListItemClick method: