在ViewPager和FragmentStatePagerAdapter上销毁页面

时间:2012-04-05 17:42:14

标签: android android-viewpager

我们正在尝试创建一个基于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时,创建的第二页将是正确的蓝色。

1 个答案:

答案 0 :(得分:13)

当您处理ListView并更改适配器的基础数据时,请调用notifyDataSetChanged(),任何反映数据集的视图都将刷新自身。这就是你应该使用片段寻呼机适配器的方式。

在您的情况下,您不会通知适配器。但是,在FragmentPagerAdapter / FragmentStatePagerAdapter的情况下,它没有区别,因为这些适配器默认忽略notifyDataSetChanged()“。使其工作覆盖适配器实现中的getItemPosition()

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

正如已经说过的,在添加/删除片段之后调用(在showOtherPage()中)

mAdapter.notifyDataSetChanged();