我使用的是ViewPager与FragmentStatePagerAdapter让一些片段之间的导航.
比方说,我有三个片段:A,B和C.ViewPager最初显示片段A,并允许您通过从右向左滑动,然后再次滑动到片段C来导航到片段B. 这允许以下导航路径:A <--> B <--> C.
我想要的是能够在片段A上从左向右滑动并让ViewPager显示片段C,即它表现为循环队列并允许 ... --> C <--> A <--> B <--> C <--> A <-- ...
我不希望片段在其他位置重复(即最终有三个以上的实例).
使用ViewPager可以实现这种包装功能吗?
目标
构建一个循环ViewPager.
第一个元素允许您达到峰值到最后一个元素并向其滑动,反之亦然.您应该能够永远向任一方向滑动.
现在这已经完成,但这些问题对我的实现不起作用.以下是一些供参考:
我是如何尝试解决问题的
我们将使用大小为7的数组作为示例.要素如下:
[0][1][2][3][4][5][6]
Run Code Online (Sandbox Code Playgroud)
当你在元素0时,ViewPagers不允许你向左滑动!多么可怕:(.为了解决这个问题,我在正面和结尾添加了1个元素.
[0][1][2][3][4][5][6] // Original
[0][1][2][3][4][5][6][7][8] // New mapping
Run Code Online (Sandbox Code Playgroud)
当ViewPageAdapter请求(instantiateItem())元素0时,我们返回元素7.当ViewPageAdapter请求元素8时,我们返回元素1.
同样在ViewPager的OnPageChangeListener中,当使用0调用onPageSelected时,我们使用setCurrentItem(7),当使用8调用onPageSelected时,我们使用setCurrentItem(1).
这有效.
问题
当您从1向左滑动到0并且我们设置了CurrentItem(7)时,它将一直向右移动6个全屏幕.这并没有给出圆形ViewPager的外观,它给出了冲动到用户请求滑动动作的相反方向的最后一个元素的外观!
这非常非常刺耳.
我是如何试图解决这个问题的
我的第一个倾向是关闭平滑(即所有)动画.它有点好,但是当你从最后一个元素移动到第一个元素时,它现在变得不稳定,反之亦然.
然后我制作了自己的Scroller.
http://developer.android.com/reference/android/widget/Scroller.html
我发现在元素之间移动时始终有1次调用startScroll(),除非我从1移动到7和7移动到1.
第一个调用是方向和数量的正确动画.
第二个调用是将所有内容向右移动多个页面的动画.
这是事情变得非常棘手的地方.
我认为解决方案是跳过第二个动画.所以我做了.会发生一个平滑的动画,从1到7,有0个打嗝.完善!但是,如果你滑动,甚至点击屏幕,你会突然(没有动画)在元素6!如果你从7滑动到1,你实际上是在元素2.没有调用setCurrentItem(2)甚至调用OnPageChangeListener,表明你在任何时间点到达2.
但是你实际上并不是第2元,这有点好.您仍处于元素1,但将显示元素2的视图.然后当你向左滑动时,你会转到元素1.即使你已经真的在元素1上了......一些代码如何帮助清理:
动画被打破,但没有奇怪的副作用
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, duration);
}
Run Code Online (Sandbox Code Playgroud)
动画有效!但一切都很奇怪和可怕......
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
if (dx > 480 || dx < -480) …Run Code Online (Sandbox Code Playgroud) 我想实现一个使用Fragments的ViewPager,并且可以在一个曲面运动中滑动,例如Page(A < - > B < - > C < - > A).我已经阅读了几篇关于如何完成此事的帖子,例如,返回有多少元素的虚假计数,并在中间开始设置位置. 如何创建循环viewpager?
这些都似乎是基于PagerAdapter.当我在扩展FragmentPagerAdapter时尝试做类似的事情时,只要我返回一个fakeCount页面,当我浏览片段时我得到一个例外,我只有2个片段.异常:java.lang.IllegalStateException:无法更改片段的标记.
我认为这是因为FragmentManager认为我处于位置2但位置2指向位于0的片段.是否有人知道如何避免这种情况?我在想我应该尝试扩展Fragmentmanager.任何示例或对此的帮助将不胜感激.