After spending several days researching this issue, I finally refuse and post this question. Answers to such questions were answered (in part), and solutions were proposed, but they did not help me. The difference between the topics discussed and my problem is as follows: Non from the others, it seems, uses SimpleCursorTreeAdapter to list ...
Problem: when I change the orientation of my device (Samsung Galaxy S), the state of group expansion is not saved and is not restored. All groups are shown closed and the list scrolls up.
The problem is already visible in demos of Android . If you installed them, go to the next step:
Views β Extensible Lists β 2. Cursor (People): run the sample, expand any group, rotate the device, and the result will display the group when folded.
In the code below, I did the following: I took the code from the API demo (ExpandableList2.java) and expanded it with implementations for onSaveInstantState (), onRestoreInstanceState () and onResume (). Implementations of these methods were taken from another topic of discussion here ( How to save scroll position in ExpandableListView ).
import android.app.ExpandableListActivity; import android.content.AsyncQueryHandler; import android.content.ContentUris; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.Parcelable; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.Contacts; import android.view.View; import android.widget.CursorTreeAdapter; import android.widget.ExpandableListView; import android.widget.SimpleCursorTreeAdapter; public class MainActivity extends ExpandableListActivity { private static final String LIST_STATE_KEY = "levelSelectListState"; private static final String LIST_POSITION_KEY = "levelSelectListPosition"; private static final String ITEM_POSITION_KEY = "levelSelectItemPosition"; private static final String[] CONTACTS_PROJECTION = new String[] { Contacts._ID, Contacts.DISPLAY_NAME }; private static final int GROUP_ID_COLUMN_INDEX = 0; private static final String[] PHONE_NUMBER_PROJECTION = new String[] { Phone._ID, Phone.NUMBER }; private static final int TOKEN_GROUP = 0; private static final int TOKEN_CHILD = 1; private static final class QueryHandler extends AsyncQueryHandler { private CursorTreeAdapter mAdapter; public QueryHandler(Context context, CursorTreeAdapter adapter) { super(context.getContentResolver()); this.mAdapter = adapter; } @Override protected void onQueryComplete(int token, Object cookie, Cursor cursor) { switch (token) { case TOKEN_GROUP: mAdapter.setGroupCursor(cursor); break; case TOKEN_CHILD: int groupPosition = (Integer) cookie; mAdapter.setChildrenCursor(groupPosition, cursor); break; } } } public class MyExpandableListAdapter extends SimpleCursorTreeAdapter {
With the debugger, I made sure that all of these methods are actually called in the correct order when the orientation of the device changes. However: restoration of state without effect.
Further debugging in it, I found that the contents of the restored listState in onRestoreInstanceState () contains an empty array, and the listState in onSaveInstanceState () contains data in its array when it is placed in outState.
So my assumption is that listState Parcelable is not saved or not restored by the system ...
Can someone point out what is going wrong, or provide a working example using the SimpleCursorTreeAdapter with a βworkingβ restore state of expand / collapsed?
(Note: To reproduce this issue with the activity code above, you need to grant android.permission.READ_CONTACTS permission)