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

时间:2018-08-29 08:09:30

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

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

从详细信息屏幕导航后,我希望在RecyclerView中具有与原来相同的滚动位置。

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

replace()片段不会发起onSaveInstanceState()的调用,这就是使用here概述的技术不适用的原因。

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

一旦您从详细信息片段中回来,就可以从活动的ViewModel中获取reycycler数据的保存实例。

答案 1 :(得分:0)

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

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