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

4

我有一个列表视图,它是一个无限滚动的列表,也就是说,当您到达数据集的底部时,它会加载更多内容。有时候,我可能已经在列表视图中向下滚动了5或6页,但当我意外改变手机方向时,列表视图会跳转到顶部。我无法记住滚动位置并进行恢复,因为每个页面都必须从互联网上加载数据(无限滚动)。

我不想锁定我的应用程序旋转功能。我该如何防止列表在每次方向改变时跳转到顶部?

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

android:configChanges="orientation"

也许是因为我正在使用片段而不是活动?

1
你看过这个吗?https://dev59.com/dXA75IYBdhLWcg3w8-HZ - Emmanuel
发布你的代码?具体来说是onCreate(),onCreateView()和onResume()。 - invertigo
2个回答

2
请参阅维护/保存/恢复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中完成的,但在片段中也应该可以工作。

0
一种解决方法是利用onSavedInstanceStateonRestoreInstanceState。每当屏幕方向改变时,保存listview的数据并恢复它。每次Android更改方向时都必须重新绘制。通过保存这些数据,您可以通过在listview中加载所有先前加载的数据并滚动到以下位置来解决问题:

对于直接滚动:

getListView().setSelection(21);

实现平滑滚动:

getListView().smoothScrollToPosition(21); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接