咱们在使用ViewPager来制做图片轮播的时候,经常为ViewPager不能一直无限循环的问题所苦恼。对于这个问题,目前从网上找到了两个思路来解决:java
将 ViewPager 的Count 的数量设置的尽量的大,而后就形成了无限循环的假象。android
第二种,方式是,假如三个图片无限循环,那么就须要用5张图片,以下图所示git
使用这种方式启动的时候,须要将 2 号图片,设置为第一张,当向前滑动的时候,由于前面的 1号图片 是和 4 号图片同样,那么,给人的错觉就像是无线循环的同样,当选中一号图片后,当即将当前选中的图片设置为 4 号图片,4号图片向5号图片滑动也是同理。ide
关于第一种方式,我想对你们来讲都不是问题,本文主要是介绍第二种方式的实现方式post
Step 1: 准备好任意3张图片测试
Step 2: 创建Adapter,为了一劳永逸,咱们须要作一些简单的封装,来方便咱们之后的使用this
通用的Adaptercode
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