嵌套片段不保留其状态

Nested Fragment not retaining its state

我有一个 Fragment A(比方说),它包含一个 FragmentPagerAdaptor,它进一步包含 Fragment(具有列表视图)。

当我点击一个列表项时,我用另一个片段(比如B)替换了完整的片段A,我还在后台堆栈中添加了片段A的事务;现在,当我从 B 按下后退按钮时,A 的子片段中的列表会重新创建并滚动到顶部。

我想保留列表的状态(滚动),我尝试存储列表的 scrollY 并重新设置它,但它不准确,列表需要一些时间来初始化,滚动也需要时间(因为列表可以包含数千个项目)。

我遇到这个 link 来解决问题:

http://ideaventure.blogspot.in/2014/10/nested-retained-fragment-lost-state.html

但是在子 Fragments 中设置 setRetainInstance(true) 会使应用程序崩溃并提示:

java.lang.IllegalStateException: 无法保留嵌套在其他片段中的片段

这也是 google 论坛中的一个已知错误:

https://code.google.com/p/android/issues/detail?id=74222

如有任何帮助,我们将不胜感激!

I want to retain the state(scroll) of the list, i have tried storing the scrollY of the list and setting it again, but it's inaccurate and the list takes some time to initialize, also it takes time to scroll(since the list can have thousands of items).

这是推荐的方法,保留片段旨在维护数据而不是 UI 元素,嵌套片段也有一些限制。有关于如何保持列表滚动位置的 SO,即:Maintain/Save/Restore scroll position when returning to a ListView。所以你应该能够找到一个可行的解决方案。

如果您的列表有一些繁重的数据结构,您可以将其放在没有 UI 的非嵌套保留片段中。此片段不会在配置更改(如屏幕旋转)期间被销毁,但当您关闭应用程序并且 Android 决定终止您的进程时,它仍会被销毁。因此,如果您忘记了这种情况,这可能会导致崩溃,您必须为此准备您的应用程序。

其他选项是将列表数据存储在 sqlite 数据库中,它不受配置更改的影响,但 sqlite 的更新可能会很慢。