如何在配置更改后设置listview的位置

时间:2015-05-06 14:51:43

标签: android listview android-fragments

我正在努力恢复我在屏幕轮换配置更改的列表视图中的位置。

在我试过的很多事情中,我来到这里:

        @Override
        public void onActivityCreated(@Nullable Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            if (savedInstanceState == null) {
...
                mVisibleItem = -1;
            } else {
                if (savedInstanceState.containsKey(LV_VISIBLE_ITEM)) {
                    mVisibleItem = savedInstanceState.getInt(LV_VISIBLE_ITEM);
                }
            }
            setRetainInstance(true);
        }

这里我试图在listview中设置位置

@Override
public void onResume() {
    super.onResume();
    if (mVisibleItem > 0) {
        mlvDictionaryIndex.setSelectionFromTop(mVisibleItem, 0);
    }
}

然而,令我惊讶的是,在旋转屏幕并观察mVisibleItem被设置为正确的值后,在onResume中我看到mVisibleItem等于-1。怎么样?

3 个答案:

答案 0 :(得分:1)

使用onSavedInstanceState在包中写入ListView.onSaveInstanceState()的返回值,并将其恢复为onActivityCreated

 @Override
 public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        if (mListView != null) {
            outState.putParcelable(LISTVIEW_INTERNAL_STATE_KEY, mListView.onSaveInstanceState());
        }
 }

重新加载数据后,您可以调用

mListView.onRestoreInstanceState(savedInstanceState.getParcelable(LISTVIEW_INTERNAL_STATE_KEY));

答案 1 :(得分:0)

覆盖onSaveInstanceState,例如“

下面
    @Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putInt("pos", pos);
}

然后在onCreate方法中读取savedInstanceState以检查这是方向更改还是新活动。

private int pos = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
     //This is a new activity
    }else{
      pos = savedInstanceState.getInt("");
    }

现在您在列表中有位置,您可以在配置更改中滚动到此位置。

答案 2 :(得分:0)

也许在重新加载listview中的数据之后,下面的代码将起作用。

 mlvDictionaryIndex.setSelectionFromTop(mVisibleItem, 0);

所以你可以使用post()方法,如下所示:

post(new Runnable() {
     public void run() {
         mlvDictionaryIndex.setSelectionFromTop(mVisibleItem, 0);
     }
});