当应用程序关闭和打开时,保留Recycler视图的滚动位置



我希望实现类似于Twitter的保存回收器视图的滚动位置。因此,当用户向下滚动x个项目,关闭应用程序,然后重新打开它时,我希望保持滚动位置。

我正在使用带有远程中介的Paging 3库,因此所有数据都保存在房间数据库中。

适配器托管在一个片段中,我已经尝试了以下

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'

但这并不奏效。

使用recyclerViewId.getLayoutManager((.findFirstVisibleItemPosition((获取屏幕上显示的第一个项目索引。将其保存在onSaveInstanceState((方法中的Bundle中当用户停止应用程序(而不是终止(时,位置将保存在Bundle中以及当启动应用程序时,在onRestoreInstanceState((方法中获取Bundle中保存的位置

例如

@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);
}
}

关闭应用程序时,可以使用SharedPreferences保存首选项中的位置。

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);

您可以使用savedInstanceState将最后一个位置放入捆绑包中,并在onResume方法上获取保存的位置

例如:

onCreate(savedInstanceState:Bundle){
savedInstanceState.put("yourKey",position)
}

当取回时

onResume(savedInstanceState:Bundle){
savedInstantState.get("yourKey")
}

最新更新