为了账号安全,请及时绑定邮箱和手机立即绑定

ViewPager作为循环队列/包装

ViewPager作为循环队列/包装

蓝山帝景 2019-08-26 15:46:21
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));


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 364 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信