viewpager 基本完美解决方案

这几天试了好几种的解决方案,但是我下面这种,我感觉应该是比较简单的也是比较完美的实现方式来实现无线循环,如果您有更好的的方案可以在下面留言,欢迎指错。

    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }
        @Override
        public void onPageSelected(int position) {
        }
        @Override
        public void onPageScrollStateChanged(int state) {
            if (state == 0) {//获取当前页面的状态   0代表滑动结束
                int currentItem = mViewPager.getCurrentItem();//获取当前页面的数字
                if (currentItem == mFragments.size() - 1) {//判断当前页面是否是最后一个页面
                    mViewPager.setCurrentItem(0, false);//是最后一个页面并且滑动结束就跳转到第一个页面 false代表取消翻页动画
                    s = 0;
                }
            }
        }
    });

上面是实现无线循环的关键代码,在配合定时器使用就可以做出来无线循环的banner ,这个是无限右滑,左滑原理相同。
下边说一下addOnPageChangeListener方法,以及内部方法参数说明。首先说明一下如果你百度viewpager无限循环,你看到的应该是setOnPageChangeListener这个监听方法,但是你照着写上的话会告诉你这个方法过时了,替代他的那就是addOnPageChangeListener这个方法,下边说下里面参数的含义;

        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }

position:当前页面position
positionOffset:当前页面偏移百分比(0是未偏移,理论上来说1是页面切换但是日志中未打印1的数字)


开始的时候.png

第一和第二页面切换的临界点,偏移百分比没有1.png
        public void onPageSelected(int position) {
            Log.e("======>", " position:" + position);
        }

position:当前页面的position(刚进入程序不会执行滑动后才会执行)


log记录.png

我们可以看到刚开始并没有记录0,而是滑动后记录的1——》2

        public void onPageScrollStateChanged(int state) {
            Log.e("======>", " state:" + state);
        }

state代表滑动状态主要有三个,来看下源码中这三个状态


三种状态.png

状态码代表的数字.png

下边看看log记录的信息


log记录.png

正常滑动就是1——》2——》0的顺序执行
1:代表当时正在滑动(必须的滑动才会出现)
2:代表手指离开屏幕,(你可以测试一下如果手指不离开屏幕2不会出现这个不好,魅族测试两个手指滑动(一手按屏幕,一手滑动,两个手指离开)不会出现2 这个状态原因不明,单手操作就会出现2)

0:就是代表滑动完成

你可能感兴趣的:(viewpager 基本完美解决方案)