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

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

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

我使用带有远程中介的Paging3库,因此所有数据都保存在本地的房间数据库中

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

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查看我的配置文件,也许会有什么帮助。虽然这样做有效,为什么作者接受了这个答案?它会在运行时保存位置,但不会在应用程序关闭和打开后保存。