Android ListView在屏幕方向更改时跳转到顶部

Android ListView在屏幕方向更改时跳转到顶部,android,Android,我得到了一个listview是一个无限滚动列表,当你到达数据集的底部时,它会加载更多。有时我可能会在列表视图中向下5或6页,当我不小心更改手机方向时,列表视图会跳到顶部。我无法尝试记住滚动位置并还原它,因为每个页面都必须从internet加载数据(无限滚动) 我不想锁定我的应用程序。每次方向改变时,如何阻止列表跳到顶部 我也在我的片段活动上尝试了以下方法,但没有效果 android:configChanges="orientation" 可能是因为我使用的是片段而不是活动?解决这一问题的一种方

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

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

我也在我的片段活动上尝试了以下方法,但没有效果

android:configChanges="orientation"

可能是因为我使用的是片段而不是活动?

解决这一问题的一种方法是使用onSavedInstanceStateonRestoreInstanceState。每当屏幕方向改变时,保存listview的数据并将其还原。每次安卓改变方向,它都必须重新绘制。通过保存此数据,您可以在listview中加载以前加载的所有数据,并在其中滚动以下内容:

对于直接滚动:

getListView().setSelection(21);
要获得平滑滚动,请执行以下操作:

getListView().smoothScrollToPosition(21); 
有关更多讨论和选项,请参见,但以下方法对我有效:

创建一个类级别变量以保存滚动位置,并创建一个状态键:

static final String STATE_SCROLL_POSITION = "scrollPosition";
int savedPosition = 0;
覆盖SaveInstanceState上的
以获取旋转前的当前位置

@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
}
@覆盖
受保护的void onPostExecute(ArrayList结果){
适配器=新的MyListAdapter(getApplicationContext(),结果);
lvTests.setAdapter(适配器);
lvTests.setSelection(savedPosition);//此处恢复位置
}
如果以另一种方式填充listview,则只需确保在设置适配器后设置滚动位置


我在一个活动中做了这些,但它也应该可以处理片段。

你看过这篇文章吗?特别是onCreate()、onCreateView()和onResume()