ViewPager作为循环队列/包装我使用的是ViewPager与FragmentStatePagerAdapter让一些片段之间的导航。比方说,我有三个片段:A,B和C。ViewPager最初显示片段A,并允许您通过从右向左滑动,然后再次滑动到片段C来导航到片段B. 这允许以下导航路径:A <--> B <--> C。我想要的是能够在片段A上从左向右滑动并使ViewPager显示片段C,即它表现为循环队列并允许 ... --> C <--> A <--> B <--> C <--> A <-- ...我不希望片段在其他位置重复(即最终有三个以上的实例)。使用ViewPager可以实现这种包装功能吗?
3 回答
HUX布斯
TA贡献1876条经验 获得超6个赞
这是一个没有虚假页面的解决方案,就像一个魅力:
public class CircularViewPagerHandler implements ViewPager.OnPageChangeListener {
private ViewPager mViewPager;
private int mCurrentPosition;
private int mScrollState;
public CircularViewPagerHandler(final ViewPager viewPager) {
mViewPager = viewPager;
}
@Override
public void onPageSelected(final int position) {
mCurrentPosition = position;
}
@Override
public void onPageScrollStateChanged(final int state) {
handleScrollState(state);
mScrollState = state;
}
private void handleScrollState(final int state) {
if (state == ViewPager.SCROLL_STATE_IDLE) {
setNextItemIfNeeded();
}
}
private void setNextItemIfNeeded() {
if (!isScrollStateSettling()) {
handleSetNextItem();
}
}
private boolean isScrollStateSettling() {
return mScrollState == ViewPager.SCROLL_STATE_SETTLING;
}
private void handleSetNextItem() {
final int lastPosition = mViewPager.getAdapter().getCount() - 1;
if(mCurrentPosition == 0) {
mViewPager.setCurrentItem(lastPosition, false);
} else if(mCurrentPosition == lastPosition) {
mViewPager.setCurrentItem(0, false);
}
}
@Override
public void onPageScrolled(final int position, final float positionOffset, final int positionOffsetPixels) {
}}你只需要将它设置为你的ViewPager作为onPageChangeListener,就是这样:( ** 现在不推荐 **检查编辑说明)
viewPager.setOnPageChangeListener(new CircularViewPagerHandler(viewPager));
为了避免在ViewPager的“结尾”出现这种蓝色光芒,您应该将此行应用于放置ViewPager的xml:
android:overScrollMode="never"
我们改进了上面的解决方案并在github上创建了一个小库。随意查看:)
编辑::根据@Bhavana注释,只需使用addOnPageChangeListener而不是setOnPageChangeListener,因为不推荐使用以后版本。
viewPager.addOnPageChangeListener(new CircularViewPagerHandler(viewPager));
- 3 回答
- 0 关注
- 399 浏览
添加回答
举报
0/150
提交
取消
