【发布时间】:2014-02-06 13:44:43
【问题描述】:
我已经实现了一个在 viewpager 中显示片段的活动。活动最初显示给定类型(类型 A)的 5 个片段。每个 A 类片段都包含一个信息列表。当一个按钮被按下时,片段被另一个类型的片段替换,类型 B(即,使用不同布局并显示不同信息的片段被加载)。
我已经使用 ViewPager 和自定义 FragmentStatePagerAdapter 实现了这一点。自定义的 FragmentStatePagerAdapter 覆盖了 getCount、instantiateItem、getItem、getItemPosition 等函数,一切正常。当我按下按钮时,视图会从片段类型 A 切换到片段类型 B。为了做到这一点,我正在使用替换片段事务,并且我还在适配器上调用 notifyDataSetChanged。从 A 类片段到 B 类片段的切换是通过在适配器的 getItem 函数中检查我需要创建哪种类型的片段来完成的。问题是切换过程(即从片段类型 A 更改为片段类型 B,反之亦然)需要一些时间(大约 2 秒) - 这种延迟非常明显且令人讨厌。
这是因为适配器的 getItemPosition 函数返回 POSITION_NONE。返回 POSITION_NONE 时,viewPager 会重新创建片段。此外,当执行替换事务时,适配器的所有项目都将被删除并重新创建所有新项目。当我切换回片段类型 A 时也会发生同样的情况。
有谁知道是否有更好或更快的方法来做到这一点?使用 FragmentPagerAdapter 应该不是一个好的解决方案,因为 viewPager 中的片段数量可能会增加。
我已经注释掉了片段的更新,问题就消失了,所以问题是更新片段所花费的时间。有没有办法异步更新片段?这应该可以解决问题。
【问题讨论】:
-
据我了解,您有两个级别的
Fragments。为什么不为 B 类的Fragments实例化第二个ViewPager?每个级别都有自己的ViewPager和FragmentStatePageAdapter,而且您不必关心必须实例化哪个Fragment。 -
A 类型的片段显示值列表。 B 类型的片段显示对应于每组值的图形。例如,我有位置 1 的销售额,位置 2 的销售额等,直到位置 5。当我单击按钮时,销售数字将替换为位置 1、2、3 的销售图表 .. 5。如果我我正在查看位置 4 的销售情况并点击按钮,我转到位置 4 的销售图表。向左或向右滑动将带我到图表 5 或 3。现在的工作方式是速度问题。我错过了什么吗?如果我需要在某个时候显示 50 个位置怎么办?
-
我认为您不必担心要显示的位置数量。
FragmentStatePagerAdapter的 Api 说:“这个版本的分页器在有大量页面时更有用,更像列表视图。当页面对用户不可见时,它们的整个片段可能会被破坏,只保留该片段的已保存状态。与 FragmentPagerAdapter 相比,这允许分页器保留与每个访问页面相关联的内存更少,但在页面之间切换时可能会产生更多开销。" -
你说你的速度有问题...你是指刷卡的时间还是
Fragment被实例化的时间。也许您必须重新组织 LocationFragments 并检查可以节省一些时间来实例化数据的地方。 -
速度问题是从我点击按钮的那一刻(改变片段的类型)到出现新类型的片段的时间 - 这是因为新类型的片段不会在创建所有片段之前一直显示。
标签: android performance android-viewpager fragment fragmentstatepageradapter