Android 当应用程序关闭和打开时,保留回收器视图的滚动位置
我希望实现保存我的回收者视图的滚动位置,类似于Twitter的做法。因此,当用户向下滚动x个项目,关闭应用程序,然后重新打开它时,我希望保持滚动位置 我使用带有远程中介的Paging3库,因此所有数据都保存在本地的房间数据库中 适配器托管在一个片段中,我已经尝试了以下方法Android 当应用程序关闭和打开时,保留回收器视图的滚动位置,android,kotlin,android-recyclerview,Android,Kotlin,Android Recyclerview,我希望实现保存我的回收者视图的滚动位置,类似于Twitter的做法。因此,当用户向下滚动x个项目,关闭应用程序,然后重新打开它时,我希望保持滚动位置 我使用带有远程中介的Paging3库,因此所有数据都保存在本地的房间数据库中 适配器托管在一个片段中,我已经尝试了以下方法 private var state: Parcelable? = null // initiating a parclable variable override fun onResume() { su
private var state: Parcelable? = null // initiating a parclable variable
override fun onResume() {
super.onResume();
adapter.stateRestorationPolicy =
RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY
binding.recyclerView.layoutManager!!.onRestoreInstanceState(state)
}
override fun onPause() {
super.onPause()
state = binding.recyclerView.layoutManager!!.onSaveInstanceState()
}
我使用的是最新版本的回收器视图库
implementation 'androidx.recyclerview:recyclerview:1.2.0'
但这不起作用。在关闭应用程序时,您可以使用共享参考在首选项中保存位置
SharedPreferences settings = getSharedPreferences("Position", MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putInt("position", position);
editor.apply();
之后,您可以在重新打开应用程序时使用它获得位置
SharedPreferences settings = getSharedPreferences("Position", MODE_PRIVATE);
int position= settings.getInt("position", null);
使用RecyclServiceWid.getLayoutManager().findFirstVisibleItemPosition()获取屏幕上显示的第一个项目索引。 将其保存在onSaveInstanceState()方法的捆绑包中 当用户停止应用程序(非终止)时,位置将保存在捆绑包中 在onRestoreInstanceState()方法中将start app get position保存在包中时 比如说
@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(icicle);
int position = recyclerViewId.getLayoutManager().findFirstVisibleItemPosition();
saveInstance.putInt("recyclerViewLastPosition", position);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if(savedInstanceState != null) {
int position = savedInstanceState.getInt("recyclerViewLastPosition", 0);
recyclerViewId.scrollToPosition(position);
}
}
您可以使用savedInstanceState将最后一个位置放入一个bundle中,并使用onResume方法获取保存的位置 例如:
onCreate(savedInstanceState:Bundle){
savedInstanceState.put("yourKey",position)
}
回来的时候呢
onResume(savedInstanceState:Bundle){
savedInstantState.get("yourKey")
}
您可以共享此引用。您可以将数据保存到房间数据库。为不同的设置(id、键、值)创建一个表,并在其中保存一个位置。这是一个很好的解决方案,但为什么要使用字符串?这只是一个示例,您可以根据需要更改类型。@CoolMind我已经编辑了答案。是的,那会更好。@CoolMind查看我的配置文件,也许会有什么帮助。虽然这样做有效,为什么作者接受了这个答案?它会在运行时保存位置,但不会在应用程序关闭和打开后保存。