ViewPager的无限轮播

本文介绍了两种实现ViewPager无限滑动的方法,一种是在适配器中处理,另一种是在数据源和监听事件中实现。第一种方法通过返回一个极大的计数值使用户无法在短时间内滑到尽头,第二种方法则通过对数据源进行特殊处理并在页面改变时调整当前页来实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ViewPager这个控件大家可能已经很熟悉了,既然熟悉可能大家也都知道这个控件是不具备无限滑动的属性的,这里为大家介绍两种无限滑动的思路。

其实这两种方法大家仔细去在网络的海洋中搜索的话会发现基本上都是这两种思路,在这里我为大家做一个总结。

方法一:在ViewPager的适配器中做手脚

public class HomeViewPageAdapter extends PagerAdapter {

    private Context context;
    //数据源的长度要大于三,否则会出现空白的现象
    private List<ImageView> mList;

    public HomeViewPageAdapter(Context context, List<ImageView> mList) {
        this.context = context;
        this.mList = mList;
    }

    @Override
    public int getCount() {
        //返回一个超级大的数字,让用户在短时间内根本滑不到头
        return mList == null ? 0 : Integer.MAX_VALUE;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        //不要再这里进行View的删除
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        //对ViewPager页号求模取出View列表中要显示的项
        position %= mList.size();
        if (position < 0) {
            position = mList.size() + position;
        }
        ImageView view = mList.get(position);

        //如果View已经在之前添加到了一个父组件,则必须先remove,否则会抛出IllegalStateException。
        ViewParent vp = view.getParent();
        if (vp != null) {
            ViewGroup parent = (ViewGroup) vp;
            parent.removeView(view);
        }
        container.addView(view);
        //add listeners here if necessary
        return view;
    }
}

接下来如果我们要想,用户在刚一进入界面的时候就可以将ViewPager向左滑动,那么我们就得在代码中加入以下代码

//这样就可以让ViewPager在刚加载的时候向左滑动了
homePageView.setCurrentItem(mList.size() * 10000);

有人说上面的这种无限滑动的方法不是正真的无限滑动,只是在短时间内用户无法滑动到头而已,如果这样的话我们来看第二种方法。

方法二:在ViewPager的数据源和监听事件中做手脚
我们先来说一下思路,比如说我们是三张图片的轮滑图片分别为,图片1、图片2、图片三,正常的情况下我们只需要把这三张图片依次放到数据源中就行了,但是为了无限滑动我们不能这么做,我们要做的就是向数据源中添加五张图片图片分别为,图片3、图片1、图片2、图片3、图片1.

//然后在数据加载完之后让ViewPager选中集合中的第二张图片
homePageView.setCurrentItem(1);

//接下来我们要在ViewPager的addOnPageChangeListener回调中进行逻辑处理。

homePageView.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
               //在这里进行逻辑处理就行
                switch (position ) {
                    //当ViewPager滑动到集合中的第一张时图片时,我们要让ViewPager加载集合中的倒数第二张图片,false是为了取消ViewPager切换时的动画
                    case 0:
                        homePageView.setCurrentItem(mList.size() - 2,false);
                        break;
                         //当ViewPager滑动到集合中的倒数第一张时图片时,我们要让ViewPager加载集合中的第二张图片,false是为了取消ViewPager切换时的动画
                    case mList.size() - 1:
                        homePageView.setCurrentItem(1,false);
                        break;
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

好了第二种方法这就完成了,不知道大家对第二种方法理解没,如果不理解我再给大家看张图吧(这张图是我盗取别人的。。。):
这里写图片描述

如果还是不清楚,那就只能怪我的表述能力差了。

PS:我还是比较喜欢第一种实现无限滑动的方式的,因为他的效果比第二种方法好,具体好在那里大家自己写一下运行看看效果就知道了。

**PS:**ViewPager的无限轮播和自动滑动基本上是一对好搭档,有了无限滑动基本上会加上自动轮播,自动滑动我就不多说了,一搜一大堆。

在这里我说一下自动滑动时ViewPager界面切换时一闪而过的现象,这个现象的发生是因为ViewPager在setCurrentItem时没有界面切换的滑动时长,要解决这个现象我们就要为ViewPager加上这个,如下:

 //设置ViewPage界面的滑动时间时间
        ViewPagerScroller scroller = new ViewPagerScroller(this);
        scroller.initViewPagerScroll(homePageView);

ViewPagerScroller 这是自定以的,具体代码如下:

public class ViewPagerScroller extends Scroller {
    private int mScrollDuration = 1200;             // 滑动速度

    /**
     * 设置速度速度
     *
     * @param duration
     */
    public void setScrollDuration(int duration) {
        this.mScrollDuration = duration;
    }

    public ViewPagerScroller(Context context) {
        super(context);
    }

    public ViewPagerScroller(Context context, Interpolator interpolator) {
        super(context, interpolator);
    }

    public ViewPagerScroller(Context context, Interpolator interpolator, boolean flywheel) {
        super(context, interpolator, flywheel);
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy, int duration) {
        super.startScroll(startX, startY, dx, dy, mScrollDuration);
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy) {
        super.startScroll(startX, startY, dx, dy, mScrollDuration);
    }

    public void initViewPagerScroll(ViewPager viewPager) {
        try {
            Field mScroller = ViewPager.class.getDeclaredField("mScroller");
            mScroller.setAccessible(true);
            mScroller.set(viewPager, this);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

好了我的笔记写完啦,希望我的这篇文章能帮到大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值