【发布时间】:2021-11-01 01:55:08
【问题描述】:
我有一个很长的 ListView,用户可以在返回上一个屏幕之前滚动它。当用户关闭应用程序并再次打开时,我希望将列表滚动到与之前相同的位置。关于如何实现这一目标的任何想法
我尝试了很多方法,但都是徒劳的
【问题讨论】:
标签: android
我有一个很长的 ListView,用户可以在返回上一个屏幕之前滚动它。当用户关闭应用程序并再次打开时,我希望将列表滚动到与之前相同的位置。关于如何实现这一目标的任何想法
我尝试了很多方法,但都是徒劳的
【问题讨论】:
标签: android
所有功劳归@Gabe Sechan 所有。根据文档活动的生命周期 -
onStart()
onRestart()
onResume()
onPause()
onStop() - Killable
onDestroy() - Killable
对于那些被标记为可终止的方法,在该方法返回后,托管该活动的进程可能随时被系统终止,而无需执行另一行代码。因此,您应该使用 onPause() 方法将任何持久性数据(例如用户编辑)写入存储。
你从@Gabe Sechan 那里得到了答案。
我想补充一点,你可以检查一下。你问-
关闭应用重新打开后如何返回列表视图的同一索引
如果用户强制关闭/杀死您的应用程序,则不会调用 onPause()/onStop()/onDestroy()。所以在onPause() 中存储数据会丢失。因此,您可以实现列表视图的setOnScrollListener 和onScrollStateChanged,以检查用户是否停止滚动,否则不存储位置。在创建活动时检索保存的数据。示例代码 -
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView;
listView = (ListView) findViewById(R.id.listView);
SharedPreferences defPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
int position = defPref.getInt("position", 0);
listView.setSelection(position);
listView.setOnScrollListener(new ListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == 0)
Log.i("ZI", "scroll stopped");
//store
ListView listView;
listView = (ListView) findViewById(R.id.listView);
int position = listView.getFirstVisiblePosition();
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = pref.edit();
editor.putInt("position", position);
editor.commit();
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
});
}
在这种情况下,我们不会在 onPause() and onResume() 上存储/检索数据。
【讨论】:
onPause() {
int position = listView.getFirstVisiblePosition()
//Write position to shared preferences
}
onResume() {
int position = //read position from shared preferences
listView.setSelection(position)
}
onPause 代码将使最顶部的项目可见(请注意它可能部分可见)。 onResume 代码会将列表视图滚动到该项目。
【讨论】: