【问题标题】:Restore RecyclerView's scroll position after performing Fragment replace()执行 Fragment replace() 后恢复 RecyclerView 的滚动位置
【发布时间】:2018-08-29 08:09:29
【问题描述】:

我有一个包含两个片段的简单活动:主要(包含项目列表)和详细信息。详细信息屏幕是一个片段,当单击主列表中的项目时显示该片段。 DetailFragment 正在使用 replace() 显示。

从详细信息屏幕返回后,我希望RecyclerView 中的滚动位置与我留下的完全相同。

只要replace()MainFragment 启动onDestroyView()onCreateView() 循环,在从DetailFragment 返回后,RecyclerView 的滚动位置为 0(在顶部),因为这是一个全新的RecyclerView,与离开DetailFragment之前的那个没有任何联系。

replace()ing 片段启动 onSaveInstanceState() 被调用,这就是为什么使用here 概述的技术不适用的原因。

我想知道处理这个用例的正确方法是什么?

当然,我可以将位置保存在onDestroyView() 上,然后手动滚动到该位置,但也许我错过了一些明显的解决方案?

不欢迎使用add() 而不是replace() 的答案。

【问题讨论】:

    标签: android android-recyclerview android-view android-scrollview android-savedstate


    【解决方案1】:

    我已经将RecyclerView 声明为NestedScrollView 的子级。这就是问题所在。

    当我摆脱 NestedScrollView 后,一切都会自动处理。

    【讨论】:

      【解决方案2】:

      由于无法使用onSaveInstanceState(),请尝试使用ViewModel 保存所需的数据。

      当您声明并将适配器设置为您的第一个 recyclerview 时,尝试通过适配器实例回调您的活动,在您的活动中,您可以尝试将 adapter instance or any required data 保存在活动的 ViewModel 中。

      从详细信息片段返回后,您可以从 Activity 的 ViewModel 中获取已保存的回收站数据实例。

      【讨论】:

      • 我为什么要在托管活动中保存Fragment 的某些状态?我确定可以将滚动位置保存到片段的ViewModel,这可以在onDestroyView() 中完成,但我的问题是如何避免此操作并使系统自动保存/恢复状态。正如问题中提到的,我知道这个解决方案,我正在寻找另一个解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多