viewpager无限左右滑动

以下文章是从几个网上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>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值