嵌套片段未保留其状态

时间:2016-02-22 10:33:51

标签: java android listview android-fragments fragmentmanager

我有一个片段A(比如说),它包含一个FragmentPagerAdaptor,它还包含片段(有列表视图)。

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

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

我遇到了这个链接来解决问题:

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

但在子片段中设置setRetainInstance(true)会导致应用程序崩溃:

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

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

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

非常感谢任何形式的帮助!

1 个答案:

答案 0 :(得分:1)

  

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

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

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

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