【发布时间】:2011-10-17 23:46:48
【问题描述】:
我正在设计一个允许用户在 ViewPager 中的多个页面之间切换的应用程序。我一直在努力弄清楚如何在屏幕上不再可见时从页面中删除 Fragment 实例,将其缓存(例如,HashMap),然后将其还原,以便当用户翻回该页面,其中的视图和其他所有内容将处于与删除之前相同的状态。例如,我的第一个页面是一个登录屏幕,它使该特定页面上的某些布局元素在成功登录时可见/不可见。当我向前翻了足够多的页面然后翻回第一页时,布局被重置。对于我的另一个页面来说,这成为一个更大的问题,其中包含一个巨大的水平/垂直滚动数据网格,我在初始化时使用后台线程进行绘制。我使用进度对话框来通知用户加载进度,每次我必须加载它时都会变得非常烦人。
所以我做了一些研究......
我浏览了 FragmentStatePageAdapter 的源代码,在 destroyItem() 回调中,被删除的 Fragment 实例的状态被保存到一个 ArrayList 中。当在 instantiateItem() 回调中创建 Fragment 的新实例时,如果项目的实例尚不存在(它们通过使用 ArrayList 来跟踪这一点),则会创建一个新的 Fragment 实例并保存其状态使用相应的 Fragment.SavedState 数据进行初始化。不幸的是,这些数据不包括视图所处的状态,尽管我注意到对于具有 GridView/ListView 的页面,视图的状态以某种方式恢复(如果我滚动到某个随机位置,翻了几页然后回来,它不会被重置)。
根据 API:
保存的状态不能包含对其他片段的依赖—— 那就是它不能使用 putFragment(Bundle, String, Fragment) 来存储 片段引用,因为当这个引用可能无效时 保存状态稍后使用。同样,片段的目标和结果 代码不包含在此状态中。
作为一个 Android 新手,我不太确定我是否理解最后一句话。
话虽如此,有没有办法缓存视图状态?如果没有,我想我会继续将所有片段页面留在内存中。
【问题讨论】:
标签: android caching adapter pager fragment