在ViewPager和FragmentStatePagerAdapter中销毁页面

9
我们正在创建一个基于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个回答

13
当你处理ListView并改变适配器的基础数据时,你调用notifyDataSetChanged(),任何反映数据集的视图都会刷新自己。同样,当使用片段页适配器时也应该这样做。
在您的情况下,您没有通知适配器。但是,在FragmentPagerAdapter/FragmentStatePagerAdapter的情况下,这没有影响,因为这些适配器默认忽略notifyDataSetChanged()。要使其正常工作,请在您的适配器实现中覆盖getItemPosition()
@Override
public int getItemPosition(Object object) {
    return POSITION_NONE;
}

正如之前所说,在你的showOtherPage()中添加或删除片段后

mAdapter.notifyDataSetChanged();

1
谢谢你的建议,但是副作用是页面切换的性能大大降低了。例如,在 Galaxy Tab 10'1(Google I/O 事件)上,切换页面需要2秒钟。在你提出建议之前,页面切换是瞬间完成的。 - Jose Faria
你可以尝试使用 mAdapter.notifyItemChanged(i)、mAdapter.notifyItemMoved(i,j)、mAdapter.notifyItemInserted(i) 或其他类似的适配器方法,而不是 mAdapter.notifyDataSetChanged() 来提高性能。 - Jenya Pu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接