执行 Fragment replace() 后恢复 RecyclerView 的滚动位置

Restore RecyclerView's scroll position after performing Fragment replace()

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

显示

从详细信息屏幕导航回来后,我希望 RecyclerView 中的滚动位置与我离开它时完全相同。

只要replace()发起onDestroyView()onCreateView()循环发生MainFragment,从DetailFragment回来后RecyclerView滚动位置为 0(在顶部),因为这是一个全新的 RecyclerView,与离开 DetailFragment.

之前的那个没有任何联系

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

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

当然我可以保存 onDestroyView() 上的位置,然后手动滚动到那个位置,但也许我遗漏了一些明显的解决方案?

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

由于onSaveInstanceState()不可行,请尝试使用ViewModel保存所需数据。

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

从详细信息片段返回后,您可以从 activity`s ViewModel 中获取已保存的 reycycler 数据实例。

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

当我摆脱 NestedScrollView 时,一切都自动处理了。