Overview

我们在使用ViewPager来制作图片轮播的时候,常常为ViewPager不能一直无限循环的问题所苦恼。对于这个问题,目前从网上找到了两个思路来解决:

  • 将 ViewPager 的Count 的数量设置的尽可能的大,然后就造成了无限循环的假象。

  • 第二种,方式是,假如三个图片无限循环,那么就需要用5张图片,如下图所示

ViewPager 无限循环_ide

使用这种方式启动的时候,需要将 2 号图片,设置为第一张,当向前滑动的时候,因为前面的 1号图片 是和 4 号图片一样,那么,给人的错觉就像是无线循环的一样,当选中一号图片后,立即将当前选中的图片设置为 4 号图片,4号图片向5号图片滑动也是同理。

ViewPager 无限循环_android_02

实现

关于第一种方式,我想对大家来说都不是问题,本文主要是介绍第二种方式的实现方式

Step 1: 准备好任意3张图片

Step 2: 建立Adapter,为了一劳永逸,我们需要做一些简单的封装,来方便我们以后的使用

通用的Adapter

package com.example.it.recycleviewpager;

import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;

/**
 * Created by 鲁迅认识的那只猹 on 9/25/2017 10:58 AM.
 * Emial 1258730808@qq.com
 * Desc:
 */

public abstract class BaseRecycleViewPagerAdapter<T> extends PagerAdapter {
    private Context context;
    private List<T> dataSource;

    public BaseRecycleViewPagerAdapter(Context context, List<T> dataSource) {
        this.context = context;
        this.dataSource = dataSource;

        //为了无线循环添加两个冗余项目
        T t1 = dataSource.get(0);
        T t2 = dataSource.get(dataSource.size() - 1);
        this.dataSource.add(dataSource.size() , t1);
        this.dataSource.add(0, t2);
    }

    /**
     * 返回视图的数量
     */
    @Override
    public int getCount() {
        return dataSource.size();
    }

    /**
     * 实例化,Page
     */
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        View view = bindingView(position);
        container.addView(view);
        return view;
    }

    /***
     * 抽象方法,绑定视图,需要子类实现
     */
    abstract View bindingView(int position);

    /**
     * 回收资源
     */
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

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

    public Context getContext() {
        return context;
    }

    public List<T> getDataSource() {
        return dataSource;
    }
}

建立Adapter,从BaseRecycleViewPagerAdapter 继承

public class AdvertisingAdapter extends BaseRecycleViewPagerAdapter<Integer> {

    public AdvertisingAdapter(Context context, List<Integer> dataSource) {
        super(context, dataSource);
    }

    /**
     * 建立我们需要用来轮播的图片
     */
    @Override
    View bindingView(int postion) {
        ImageView imageView = new ImageView(getContext());
        imageView.setLayoutParams(new ViewGroup.LayoutParams(-1, -1));
        imageView.setImageResource(getDataSource().get(postion));
        return imageView;
    }
}

Step3: 测试我们的Adapter

public class MainActivity extends AppCompatActivity {

    private ViewPager viewPager;
    private AdvertisingAdapter advertisingAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewPager = (ViewPager) this.findViewById(R.id.vp);
        init();
    }

    void init() {
        List<Integer> resIdList = new ArrayList<>();
        resIdList.add(R.drawable.pet2);
        resIdList.add(R.drawable.pet3);
        resIdList.add(R.drawable.pet4);
        advertisingAdapter = new AdvertisingAdapter(this, resIdList);
        viewPager.setAdapter(advertisingAdapter);
        //设置第二张图片为最初显示的图片
        viewPager.setCurrentItem(1);
        //设置Item的选中事件,实现循环
        viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                if (position == 0)
                    viewPager.setCurrentItem(viewPager.getAdapter().getCount() - 2, false);
                if (position == viewPager.getAdapter().getCount() - 1)
                    viewPager.setCurrentItem(1, false);
            }
        });
    }
}

源码下载

基本的需求已经实现,如果还有更多的需求,还可以根据上面的扩展。

码云: https://gitee.com/ShareKnowledge/RecycleViewPager

除非特殊声明否则,本博客文章均属 鲁迅认识的那只猹 原创,未经许可禁止转载,否则将保留追究法律责任的权利。

如果本博客损害了您的相关权益,请及时联系我,我将妥善处理。