ListView跳转到屏幕方向更改的顶部

时间:2013-09-04 16:32:34

标签: android

我得到的listview是一个无限滚动列表,即当你到达数据集的底部时它会加载更多。有时我可能在列表视图中有5或6页,当我不小心改变手机方向时,列表视图会跳到顶部。我不能尝试记住滚动位置并恢复它,因为必须从互联网上为每个页面加载数据(无限滚动)

我不想锁定我的应用轮播。每次方向改变时,如何阻止列表跳到顶部?

我还在片段活动上尝试了以下内容,但它没有效果

android:configChanges="orientation"

也许是因为我使用的是片段,而不是活动?

2 个答案:

答案 0 :(得分:2)

有关更多讨论和选项,请参阅Maintain/Save/Restore scroll position when returning to a ListView,但以下方法对我有用:

创建一个类级变量来保存滚动位置以及状态键:

static final String STATE_SCROLL_POSITION = "scrollPosition";
int savedPosition = 0;

覆盖onSaveInstanceState以在轮换前获取当前位置。

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {

    // Save the user's current game state
    int currentPosition = lvTests.getFirstVisiblePosition();
    savedInstanceState.putInt(STATE_SCROLL_POSITION,
            currentPosition);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

然后在重新创建活动时返回保存的位置:

public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);

    savedPosition = savedInstanceState
            .getInt(STATE_SCROLL_POSITION);
    listView.setSelection(savedPosition);

}

在我的一项活动中,我使用AsyncTask(作为我的活动中的子类)来填充我的ListView,并且必须恢复onPostExecute方法中的位置。

@Override
protected void onPostExecute(ArrayList<Test> result) {

    adapter = new MyListAdapter(getApplicationContext(), result);
    lvTests.setAdapter(adapter); 

    lvTests.setSelection(savedPosition); // position is restored here
}

如果您以其他方式填充列表视图,则只需确保在设置适配器后设置滚动位置。

我在一个Activity中做了这些,但它也应该与片段一起使用。

答案 1 :(得分:0)

您可以解决此问题的一种方法是使用 onSavedInstanceState onRestoreInstanceState 。每当屏幕方向更改时,保存列表视图的数据并将其恢复。每当android改变方向时,它必须重新绘制。通过保存这些数据,您可以通过在列表视图中加载所有以前加载的数据并使用以下内容滚动来处理:

直接滚动:

getListView().setSelection(21);

顺畅滚动:

getListView().smoothScrollToPosition(21);