ViewPager作为循环队列/包装

ViewPager作为循环队列/包装

我使用的是ViewPagerFragmentStatePagerAdapter让一些片段之间的导航。

比方说,我有三个片段:ABC。ViewPager最初显示片段A,并允许您通过从右向左滑动,然后再次滑动到片段C来导航到片段B. 这允许以下导航路径:A <--> B <--> C

我想要的是能够在片段A上从左向右滑动并使ViewPager显示片段C,即它表现为循环队列并允许 ... --> C <--> A <--> B <--> C <--> A <-- ...

我不希望片段在其他位置重复(即最终有三个以上的实例)。

使用ViewPager可以实现这种包装功能吗?


蓝山帝景
浏览 365回答 3
3回答

HUX布斯

这是一个没有虚假页面的解决方案,就像一个魅力:public&nbsp;class&nbsp;CircularViewPagerHandler&nbsp;implements&nbsp;ViewPager.OnPageChangeListener&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;ViewPager&nbsp;&nbsp;&nbsp;mViewPager; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mCurrentPosition; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mScrollState; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;CircularViewPagerHandler(final&nbsp;ViewPager&nbsp;viewPager)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mViewPager&nbsp;=&nbsp;viewPager; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onPageSelected(final&nbsp;int&nbsp;position)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mCurrentPosition&nbsp;=&nbsp;position; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onPageScrollStateChanged(final&nbsp;int&nbsp;state)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handleScrollState(state); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mScrollState&nbsp;=&nbsp;state; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;handleScrollState(final&nbsp;int&nbsp;state)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(state&nbsp;==&nbsp;ViewPager.SCROLL_STATE_IDLE)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setNextItemIfNeeded(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;setNextItemIfNeeded()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!isScrollStateSettling())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handleSetNextItem(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;boolean&nbsp;isScrollStateSettling()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;mScrollState&nbsp;==&nbsp;ViewPager.SCROLL_STATE_SETTLING; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;handleSetNextItem()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;int&nbsp;lastPosition&nbsp;=&nbsp;mViewPager.getAdapter().getCount()&nbsp;-&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(mCurrentPosition&nbsp;==&nbsp;0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mViewPager.setCurrentItem(lastPosition,&nbsp;false); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if(mCurrentPosition&nbsp;==&nbsp;lastPosition)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mViewPager.setCurrentItem(0,&nbsp;false); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onPageScrolled(final&nbsp;int&nbsp;position,&nbsp;final&nbsp;float&nbsp;positionOffset,&nbsp;final&nbsp;int&nbsp;positionOffsetPixels)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;}}你只需要将它设置为你的ViewPager作为onPageChangeListener,就是这样:( **&nbsp;现在不推荐&nbsp;**检查编辑说明)viewPager.setOnPageChangeListener(new&nbsp;CircularViewPagerHandler(viewPager));为了避免在ViewPager的“结尾”出现这种蓝色光芒,您应该将此行应用于放置ViewPager的xml:android:overScrollMode="never"我们改进了上面的解决方案并在github上创建了一个小库。随意查看:)编辑::根据@Bhavana注释,只需使用addOnPageChangeListener而不是setOnPageChangeListener,因为不推荐使用以后版本。&nbsp;viewPager.addOnPageChangeListener(new&nbsp;CircularViewPagerHandler(viewPager));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android