在ViewPager中使用View或Fragment

7
关于在ViewPager中使用View或Fragment的问题。
背景: 我有一个Activity A,它包含一个ListView。每个ListView项都会打开Activity B。根据在Activity A中点击的ListView项不同,Activity B会显示不同的内容。Activity B的内容显示在一个ListView中。
问题: 现在,我需要在Activity B内实现水平翻页以切换内容,而不是在 Activity A 和 B 之间来回切换。我找到了一种解决方案(已尝试并可行),即创建许多Activity B的ListView实例,并将其与ViewPager + PagerAdapter一起使用。文档中还发现了另一个潜在的解决方案(未尝试),即将该ListView带入Fragment中,创建许多Fragment实例,并将其与ViewPager + FragmentPagerAdapter或FragmentStatePagerAdapter一起使用。
我的问题是,使用每种方法的好处是什么?我是否应该费力地将ListView带入到Fragment中,还是只需使用ListView和ViewPager?
谢谢
1个回答

12
一个Fragment是一个有用的方法,我认为当你想要将一些UI业务逻辑与特定的View(或一组)绑定时。正如你所知,个别的Fragment 有自己的生命周期回调等,就像一个Activity一样。
相比于通过单一的PagerAdapter让一个单一的Activity托管多个ListView,使用Fragment的方式可能更加简洁,因为Fragment仅需要处理驱动单个ListView的逻辑。
这与我刚刚面对的情况非常相似。我在ViewPager中显示各种垂直滚动表单(由许多输入字段组成)。在我的情况下,我选择了Fragment的方法,因为在我的情况下,可能需要在某些页面上实际显示完全不同类型的视图。例如,在前几个页面上,可能会显示用户输入表单。但在最后一页上,将显示一个图形。驱动那个图形需要一个完全不同的逻辑集合。从单个Activity中驱动那些输入表单和一个图形会变得有点混乱,我可能需要使用几个委托类来包含业务逻辑。因此,对我来说,Fragment最后是显而易见的选择。我有我的InputFormFragment和一个GraphFragment,它们分别只包含为它们提供的View适用的适用逻辑。

另一个需要考虑的问题是,在不久的将来,您可能还想在您的 ViewPager 中展示另一种不同的 View。或者,您可能想要完全不同的UI布局,也许是一种不使用 ViewPager 但是会将它们全部并排显示的布局(例如,大型平板电脑横屏模式下使用的布局)。使用 Fragment,代码更加模块化,可以更快速地实现此目标。然而,如果您通过使用一个包含简单的 PagerAdapter 和所有逻辑的 ListView,来实现您的目标,则在未来支持新类型的 View 或特殊的平板电脑布局时,您可能会发现需要投入更多的工作。

我要说的一件事是,我自己已经通过 FragmentPagerAdapterFragmentStatePagerAdapterViewPager 中实现了 Fragment,如果您有任何特殊要求,情况可能会变得有点棘手。有时管理 Fragment 可能会很麻烦。例如,对于我的UI,我需要能够以编程方式添加和删除包含 FragmentViewPager。我还需要确保正在使用的适配器不会在显示 Fragment 后销毁它们,因为我需要在某个特定点同时收集所有 Fragment 的数据。此外,我还必须扩展和修改 FragmentPagerAdatper,以确保 Fragment 正确执行其 onDestroy() 并在删除 ViewPager 时从 FragmentManager 中删除。

Fragment可以非常模块化地构建适用于各种屏幕尺寸和方向的UI,并且它们能够很好地将业务逻辑和生命周期封装在单个UI元素中。但是,如果您的情况确实就像在ViewPager中有几个ListView那样简单,并且您知道永远不需要模块化,则使用Fragment可能会过度。


关于从片段中收集信息,创建一个接口,让片段托管对实现它的对象的引用,并使用接口函数将信息存储在该对象中,这样做不是更容易吗? - user1545072
如果我理解正确,我认为你建议的是,不需要做聪明的事情来确保所有片段都留在ViewPager中(并且不会不断地被杀死然后再次创建),而是应该有一种机制来保存它们的状态。我本可以这样做,我同意这将是更好的方法,但是我的特定应用程序中的片段构造成本相当高。出于编码和性能原因,更直接的方法是确保所有片段都留在那里,然后请求它们一起提交数据。 - Trevor

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