4

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

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

我也对我的片段活动进行了以下尝试,但没有效果

android:configChanges="orientation"

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

4

2 回答 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 中完成了这些,但它也应该与片段一起使用。

于 2014-10-22T05:30:12.660 回答
0

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

对于直接滚动:

getListView().setSelection(21);

对于平滑滚动:

getListView().smoothScrollToPosition(21); 
于 2013-09-04T16:46:22.063 回答