我去了SO的一个着名帖子,Maintain/Save restore scroll position 但根本没有帮助我。
我在Fragment中有一个ListView,如果我改变方向,我想saveInstance Bundle会保存我的位置。 我有
private static final String LIST_STATE = "listState";
private Parcelable mListState = null;
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mListState = listView.onSaveInstanceState();
outState.putParcelable(LIST_STATE, mListState);
}
如果我放入OnCreateView或onActivityCreated以下代码并不重要
if(savedInstanceState!=null) {
mListState = savedInstanceState.getParcelable(LIST_STATE);
listView.onRestoreInstanceState(mListState);
列表的向上位置根本没有恢复。 我可以很容易地从Bundle中的调试中看到调试在Bundle中识别位置
AbsListView.SavedState {3d7562e0 selectedId = -9223372036854775808 firstId = 25 viewTop = -38 position = 5 height = 717 filter = null checkState = NULL}
我甚至试图以孤立的方式从Bundle中提取这个位置而不是所有的值,但没有成功。
答案 0 :(得分:1)
在片段
中添加以下代码@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
答案 1 :(得分:1)
发现它!
解决方案是
length
并在onCreateView
中 @Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mPosition2=listView.getFirstVisiblePosition();
if(mPosition2!=0) {
mPosition = mPosition2;
}
if (mPosition != ListView.INVALID_POSITION) {
outState.putInt(SELECTED_KEY, mPosition);
}
}
最后我有一个在onLoadFinished结束时查询内容提供者的加载器(但你可以把它放在你需要的地方)
if (savedInstanceState != null && savedInstanceState.containsKey(SELECTED_KEY)) {
mPosition = savedInstanceState.getInt(SELECTED_KEY);
}
我也试过listView.smoothScrollToPosition(mPosition) 但目前还没有工作,但不要介意它对我来说真的很好。