【问题标题】:Destroy Pages on ViewPager and FragmentStatePagerAdapter销毁 ViewPager 和 FragmentStatePagerAdapter 上的页面
【发布时间】:2012-04-05 17:42:14
【问题描述】:

我们正在尝试创建一个基于 ViewPager 的 Android 应用程序,该应用程序在运行时接收添加和删除页面的指令。几乎就像选项卡式浏览器体验一样,您可以删除当前选项卡或删除特定选项卡。

根据 Google 文档,我们使用 FragmentStatePagerAdapter,它旨在用于有大量页面的情况,更像是列表视图。

但是当我们尝试: - 删除不在屏幕上的页面 - 并从同一个类创建一个新的片段对象 - 并在页面的同一位置删除 我们注意到 Android 平台恢复了死页并将其显示给用户。我们刚刚创建的新对象根本不会运行“onCreate”、“onCreateView”或“onActivityCreated”。

我们正在寻找解决此问题的方法,该问题迫使平台使用来自同一类的新片段对象。有什么想法吗?

我们发现,如果我们销毁当前页面,平台确实会销毁该页面并从同一类创建一个新对象。这是一个复制问题和此行为的小示例。

来源:http://dl.dropbox.com/u/8333012/SimpleAdapter/SimplePager.zip

视频:http://www.youtube.com/watch?v=-oaXXwU8PSI&hd=1

从这个项目中,当您触摸第一页上的 TextView 时,它旨在将第二页(绿色)移除到新的蓝色页面。你会看到,即使从第一页开始,第二页仍然是绿色的。但是当您按下第二页(绿色)上的返回 Android 按钮并触摸 TextView 时,创建的第二页将是正确的蓝色。

【问题讨论】:

    标签: android android-viewpager


    【解决方案1】:

    当您处理 ListView 并更改您调用 notifyDataSetChanged() 的适配器的底层数据时,任何反映数据集的视图都会自行刷新。这也是您应该使用片段寻呼机适配器的方式。

    在您的情况下,您没有通知适配器。但是,在FragmentPagerAdapter/FragmentStatePagerAdapter 的情况下,它并没有什么不同,因为这些适配器“默认”忽略notifyDataSetChanged()。为了让它工作覆盖你的适配器实现中的getItemPosition()

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }
    

    如前所述,添加/删除片段调用后(在您的showOtherPage()

    mAdapter.notifyDataSetChanged();
    

    【讨论】:

    • 谢谢,但作为副作用,更改页面的性能大大降低。就像 2 秒在 Galaxy Tab 10'1 上更改页面(Google I/O 活动)。在您提出建议之前,它是瞬间完成的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多