方向:恢复片段内的ListView位置

时间:2016-04-06 13:04:54

标签: android listview android-fragments

我去了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中提取这个位置而不是所有的值,但没有成功。

2 个答案:

答案 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) 但目前还没有工作,但不要介意它对我来说真的很好。