在一些实验之后我做了一个满意的解决,它还保留了很好的滚动位置顶部可见项。
事实上,三种不同部分的信息需要保存和恢复: 状态( e .g列表。 其中组被展开),第一个可见项的索引和优良滚动位置。
不幸的是,似乎只有第一个保存由onSaveInstanceState可展开列表视图的方法,所以其他两个需要单独存储。 这不同于非可展开列表视图,其中,看来在onSaveInstanceState方法保存所需要的所有信息正确的恢复状态和位置列表( 对于这个主题,参看 Scroll到中的某一位置listView ) 。?
下面是代码段,之上ExpandableListActivity派生类:private static final String LIST_STATE_KEY = "listState";
private static final String LIST_POSITION_KEY = "listPosition";
private static final String ITEM_POSITION_KEY = "itemPosition";
private Parcelable mListState = null;
private int mListPosition = 0;
private int mItemPosition = 0;
然后,一些继承自:protected void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
// Retrieve list state and list/item positions
mListState = state.getParcelable(LIST_STATE_KEY);
mListPosition = state.getInt(LIST_POSITION_KEY);
mItemPosition = state.getInt(ITEM_POSITION_KEY);
}
protected void onResume() {
super.onResume();
// Load data from DB and put it onto the list
loadData();
// Restore list state and list/item positions
ExpandableListView listView = getExpandableListView();
if (mListState != null)
listView.onRestoreInstanceState(mListState);
listView.setSelectionFromTop(mListPosition, mItemPosition);
}
protected void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
// Save list state
ExpandableListView listView = getExpandableListView();
mListState = listView.onSaveInstanceState();
state.putParcelable(LIST_STATE_KEY, mListState);
// Save position of first visible item
mListPosition = listView.getFirstVisiblePosition();
state.putInt(LIST_POSITION_KEY, mListPosition);
// Save scroll position of item
View itemView = listView.getChildAt(0);
mItemPosition = itemView == null ? 0 : itemView.getTop();
state.putInt(ITEM_POSITION_KEY, mItemPosition);
}
它也能在我Froyo设备。