Android:Viewpager和FragmentStatePageAdapter

And*_*oob 9 android caching adapter fragment pager

我正在设计一个允许用户在ViewPager中的多个页面之间切换的应用程序.我一直在努力弄清楚如何在屏幕上不再可见的情况下从页面中删除Fragment实例,将其缓存(比如说,HashMap),然后将其恢复以便在用户使用时翻转到该页面,视图和其中的所有内容将处于删除之前的状态.例如,我的第一个页面是一个登录屏幕,它使成功登录时该特定页面上的某些布局元素可见/不可见.当我向前翻页足够的页面然后翻到第一页时,布局就会重置.这对于我的另一个页面来说更成为一个问题,它包含一个巨大的水平/垂直滚动数据网格,我在后台使用一个线程在初始化时绘制.我使用进度对话框来通知用户加载进度,每次我必须加载它时都会变得非常烦人.

所以我做了一些研究......

我浏览了FragmentStatePageAdapter的源代码,并在destroyItem()回调中,删除的Fragment实例的状态保存到ArrayList.当在instantiateItem()回调中创建Fragment的新实例时,如果项目的实例尚不存在(它们通过使用ArrayList跟踪它),则会创建一个新的Fragment实例并保存其状态使用相应的Fragment.SavedState数据初始化.不幸的是,这个数据不包括视图所在的状态,虽然我注意到对于带有GridView/ListView的页面,视图的状态以某种方式被恢复(如果我滚动到某个随机位置,翻了几页然后回来,它不会被重置).

根据API:

保存的状态不能包含对其他片段的依赖性 - 也就是说它不能使用putFragment(Bundle,String,Fragment)来存储片段引用,因为该引用在以后使用此保存状态时可能无效.同样,Fragment的目标和结果代码不包含在此状态中.

作为Android的菜鸟,我不太清楚我理解最后的陈述.

话虽如此,有没有办法缓存View状态?如果没有,我想我会继续将所有片段页留在内存中.

MJD*_*MJD 1

查看各种文档片段,我最好的猜测是您正在创建的视图没有附加 ID。假设片段的保存状态是从 Fragment.onSaveInstanceState 创建的,那么片段将自动保存任何具有 id 的视图状态。如果您从布局文件创建 ListView/GridView,则可能有一个与您的 ListView/GridView 关联的默认 ID。您还可以通过调用 setId 将 id 与视图关联起来。

此外,对于自定义填充的片段,您可能还需要在 onSaveInstanceState 中执行一些自定义操作。