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