循环ViewPager使用FragmentPagerAdapter

Pro*_*fes 7 android android-fragments android-viewpager

我想实现一个使用Fragments的ViewPager,并且可以在一个曲面运动中滑动,例如Page(A < - > B < - > C < - > A).我已经阅读了几篇关于如何完成此事的帖子,例如,返回有多少元素的虚假计数,并在中间开始设置位置. 如何创建循环viewpager?

这些都似乎是基于PagerAdapter.当我在扩展FragmentPagerAdapter时尝试做类似的事情时,只要我返回一个fakeCount页面,当我浏览片段时我得到一个例外,我只有2个片段.异常:java.lang.IllegalStateException:无法更改片段的标记.

我认为这是因为FragmentManager认为我处于位置2但位置2指向位于0的片段.是否有人知道如何避免这种情况?我在想我应该尝试扩展Fragmentmanager.任何示例或对此的帮助将不胜感激.

Fer*_*rgo 1

我在 GitHub 上有一个项目,其中包含我创建的一些小部件。这是它:

https://github.com/Cyber​​Eagle/AndroidWidgets

在以下包中,有与 CircularViewPager 一起使用的适配器: https://github.com/Cyber ​​Eagle/AndroidWidgets/tree/master/src/main/java/br/com/cybereagle/androidwidgets/adapter

首先,您将在布局中使用 CircularViewPager 而不是 ViewPager。CircularViewPager 在这里:https://github.com/Cyber​​Eagle/AndroidWidgets/blob /master/src/main/java/br/com/cybereagle/androidwidgets/view/CircularViewPager.java

此 ViewPager 需要 WrapperCircularPagerAdapter,而不是 PagerAdapter。这个包装器用于欺骗ViewPager,使其认为ViewPager中有很多项目,但实际上它重复了您的项目以产生循环效果。因此,您将实现 CircularFragmentPagerAdapter、CircularFragmentStatePagerAdapter 或 CircularPagerAdapter,而不是实现 PagerAdapter、FragmentPagerAdapter 或 FragmentStatePagerAdapter。然后,您将使用 WrapperCircularPagerAdapter 包装您的适配器,并在 CircularViewPager 中设置包装器,而不是您的适配器。此外,当需要通知数据集更改时,您将在包装器中调用notifyDatasetChanged()。

在实现其中一个循环适配器时,您会注意到,您必须实现 instantiateVirtualItem,而不是实现 instantiateItem。对于片段的寻呼机适配器,您将实现 getVirtualItem 而不是 getItem。那是因为我创造了虚拟物品的概念。

为了清楚起见,想象一个包含 4 个项目的视图寻呼机,每个项目代表一首音乐。当你一直向左走时,你会在第一个项目的左边看到第四个项目。实际上,它是一个全新的项目,但它与代表第四首音乐的虚拟项目相关联。

另一个例子:想象现在只有一首音乐。您将在左侧和右侧看到相同的音乐。一次有 3 个物品,但只有一个虚拟物品。

因此,正如所解释的,Wrapper 欺骗了 ViewPager,使其认为有很多项目。为了让用户更难到达 ViewPager 的一端(无论如何都会花费很长时间),每次数据集发生更改时,ViewPager 都会转到相同的虚拟项目,但转到其中之一靠近中间的真实物品。

更重要的一件事是 CircularViewPager 有 setCurrentVirtualItem 方法。该方法计算哪个真实物品是最接近的所需虚拟物品,然后使用 setCurrentItem 来设置它。您还可以选择使用 getCurrentVirtualItem,它将返回当前虚拟项目的索引。请注意,如果您使用 getCurrentItem,您将获得一个大索引。

嗯,就是这样。对于缺少该项目的文档,我深感抱歉。我计划尽快将其记录下来。我还计划消除对包装的需要。请随意复制代码(尊重 Apache 2.0 许可证)、fork 甚至为其做出贡献。