2016-02-22 98 views
-1

我有一个片段A(说),其中包含一个FragmentPagerAdaptor,其中进一步包含碎片(有列表视图)。当我点击一个列表项时,我用另一个片段(比如说B)替换了完整的片段A,我也在后面的堆栈中添加了片段A的事务;现在,当我按下B后退按钮时,A的子片段中的列表被重新创建并滚动到顶部。我想保留列表的状态(滚动),我试图存储列表的scrollY并重新设置,但它不准确,列表需要一些时间来初始化,也需要时间来滚动(自该列表可以有数千个项目)。嵌套片段不保留其状态

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

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

但在孩子片段设置setRetainInstance(真正的)崩溃的应用程序说:

java.lang.IllegalStateException:能否”吨保持嵌套在其它片段

它也是在谷歌论坛一个已知的错误fragements:

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

任何形式的帮助将不胜感激!

+0

不会替换片段A简单地添加片段B和隐藏片段A并将您的事务添加到后退堆栈以进行自动处理反之亦然。 –

回答

1

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

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

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

其他选项是将你的列表数据存储在sqlite数据库中,它可以免除配置更改,但可能更新sqlite可能会很慢。