以下文章是从几个网上demo中结合而来的,感谢前辈们提供的肩膀,所以之后的事我们才能做的轻松愉快,
之前找了几个demo要么运行时有点BUG,要么就是直接将viewpager的页数设置的很大,用户难以滑动到边界,看似像无限滑动,但是如果用户有足够的耐性,终有一刻会滑完,所以,认为此方法不是很好,接下来的这个demo个人修改了一下,自认为没有什么大的BUG,注释都写在了代码中,原理大家可以从网络上看一下,就是总共的viewpager的页数其实是比原始的页数页数多了两页,就最前面多一页,最后面多一页,详细的情况请看网络解释,上代码了
这里是适配器MyAdapter代码
public class MyAdapter extends PagerAdapter {
private ImageView[] mImageViews;
public MyAdapter(ImageView[] mImageViews) {
this.mImageViews = mImageViews;
}
@Override
public int getCount() {
return mImageViews.length;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public void destroyItem(View container, int position, Object object) {
((ViewPager) container).removeView(mImageViews[position
% mImageViews.length]);
}
/**
* 载入图片进去,用当前的position 除以 图片数组长度取余数是关键
*/
@Override
public Object instantiateItem(View container, int position) {
((ViewPager) container).addView(mImageViews[position
% mImageViews.length], 0);
return mImageViews[position % mImageViews.length];
}
}
这里是viewpager滑动监听类代码
public class MyOnPageChangeListener implements OnPageChangeListener {
private boolean mIsChanged = false;
private ImageView[] mImageViews;
private ViewPager viewPager;
private int currentIndex = 1;
public MyOnPageChangeListener(ImageView[] mImageViews, ViewPager viewPager) {
this.mImageViews = mImageViews;
this.viewPager = viewPager;
}
// 第二步
@Override
public void onPageScrollStateChanged(int arg0) {
if (ViewPager.SCROLL_STATE_IDLE == arg0) {// 当页面停止滑动后,触发该条件
if (mIsChanged) {// 并且已经执行完了onPageSelected()方法,
//因为该方法在一次滑动中会被重复调用,所以使用一个标志量来区分是不是最后一次调用
mIsChanged = false;
// 下面这个方法是悄悄更换当前页面,并且不使用动画,所以用户看不到效果,
//用户以为是第0页,其实现在是倒数第2页,或者用户以为是最后一页,其实是第1页
viewPager.setCurrentItem(currentIndex, false);
}
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
// 第一步
// 以下逻辑是实现循环的关键,请仔细阅读
@Override
public void onPageSelected(int position) {
mIsChanged = true;// viewpager滑动完毕标志,现在处于未滑动状态
if (mImageViews.length > 1) { // 当图片数量多于1张时,方可循环滑动
if (position == 0) {// 当前页面为0,即当前图片和真实图片中的最后一张相同时
// 这里是滑动到最左边,此时继续向左滑动,方可触发该条件
currentIndex = mImageViews.length - 2;// 将当前页面改为真实图片中的最后一张的页数
} else if (position == mImageViews.length - 1) {// //当前页面为最后一张时,即当前图片和真实图片中的第一张相同时
// 这里是滑动到最右边,此时继续向右滑动,方可触发该条件
currentIndex = 1;// 将当前页面改为真实图片中的第一张的页数
} else {
currentIndex = position;// 其余状态不该,保持常态
}
}
}
}
这里是activity代码
public class MyActivity extends Activity {
/**
* ViewPager
*/
private ViewPager viewPager;
/**
* 装点点的ImageView数组
*/
private ImageView[] tips;
/**
* 装ImageView数组
*/
private ImageView[] mImageViews;
/**
* 图片资源id
*/
private int[] imgIdArray;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
viewPager = (ViewPager) findViewById(R.id.viewPager);
// 载入图片资源ID,注意我们载入的图片中,有两张图片是一样的这里是关键
imgIdArray = new int[] { R.drawable.item08, R.drawable.item01,
R.drawable.item02, R.drawable.item03, R.drawable.item04,
R.drawable.item05, R.drawable.item06, R.drawable.item07,
R.drawable.item08, R.drawable.item01 };
// 将图片装载到数组中
mImageViews = new ImageView[imgIdArray.length];
for (int i = 0; i < mImageViews.length; i++) {
ImageView imageView = new ImageView(this);
mImageViews[i] = imageView;
imageView.setBackgroundResource(imgIdArray[i]);
}
// 设置Adapter
viewPager.setAdapter(new MyAdapter(mImageViews));
// 设置监听,主要是设置点点的背景
viewPager.setOnPageChangeListener(new MyOnPageChangeListener(
mImageViews, viewPager));
// 设置初始页面,这样用户看到的就是第一张,往左滑动,看到的是第七张,其实是第0张而已
viewPager.setCurrentItem(1);
}
}
最后上配置上布局文件,很简单的
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center">"
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="fill_parent"
android:layout_height="200dp" />
</RelativeLayout>