最近要弄一个viewpager的无限循环。网上找了看了下!
有在首页和尾页各加一个创造无限循环的,还有设置adapter无限数量的取值用余来算当前位置的,这边就不说了!
然后我就研究了一下viewpager的addOnPageChangeListener事件
下面就来说下
首先
实现这个监听有3个方法
onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
监听滑动的距离和当前哪个页面在滑动
onPageSelected(int position)
监听滑动成功之后处在在页面
onPageScrollStateChanged(int state)
监听滑动过程
这边就是在onPageScrollStateChanged(int state)中的状态进行判断做了一个比较简单的判断
我们要知道state有3个状态
ViewPager.SCROLL_STATE_IDLE | 闲置状态 |
ViewPager.SCROLL_STATE_DRAGGING | 拖动状态 |
ViewPager.SCROLL_STATE_SETTLING | 安放状态 |
下面我在状态判断中写入以下代码
@Override
public void onPageScrollStateChanged(int state) {
int cur = mViewPager.getCurrentItem();
int count = adapter.getCount();
switch (state){
case ViewPager.SCROLL_STATE_IDLE:
if (cur == 0){
Log.e("-s-", "第一页 回归闲置");
}else if(cur == count - 1){
Log.e("-s-", "最后一页 回归闲置");
}else{
Log.e("-s-", "其他页 回归闲置");
}
break;
case ViewPager.SCROLL_STATE_DRAGGING:
if (cur == 0){
Log.e("-s-", "第一页 拖动中");
}else if(cur == count - 1){
Log.e("-s-", "最后一页 拖动中");
}else{
Log.e("-s-", "其他页 拖动中");
}
break;
case ViewPager.SCROLL_STATE_SETTLING:
if (cur == 0){
Log.e("-s-", "第一页 安放成功");
}else if(cur == count - 1){
Log.e("-s-", "最后一页 安放成功");
}else{
Log.e("-s-", "其他页 安放成功");
}
break;
}
}
然后对一个有3个页面的viewpager进行以下滑动
第一页往左滑动(无法滑动)
===> 第一页往右滑动(到第二页)
===> 第二页往右滑动(到最后一页)
===> 最后一页往右滑动(无法滑动)
log如下
我们能看到开始因为无法滑动所以第一页进行了拖动之后直接回到了闲置
之后从第一页到第二页的时候的显示是第一页拖动然后进入第二页安放成功再回到第二页闲置。
实现无限循环
经过以上的log判断我们可以在拖动状态加一个锁,然后在安放的地方解除这个锁。在闲置的时候进行页面的强制跳转不就可以实现一个简单的无限循环
我们对刚才的代码进行修改
private boolean isChange = false;
@Override
public void onPageScrollStateChanged(int state) {
int cur = mViewPager.getCurrentItem();
int count = adapter.getCount();
switch (state){
case ViewPager.SCROLL_STATE_IDLE:
if (cur == 0){
if (!isChange){
Log.e("-s-", "并未切换成功,强制跳到最后一页");
mViewPager.setCurrentItem(count,false);
}else{
Log.e("-s-", "第一页 回归闲置");
}
}else if(cur == count - 1){
if (!isChange){
Log.e("-s-", "并未切换成功,强制跳到第一页");
mViewPager.setCurrentItem(0,false);
}else{
Log.e("-s-", "最后一页 回归闲置");
}
}else{
Log.e("-s-", "其他页 回归闲置");
}
break;
case ViewPager.SCROLL_STATE_DRAGGING:
isChange = false;
if (cur == 0){
Log.e("-s-", "第一页 拖动中");
}else if(cur == count - 1){
Log.e("-s-", "最后一页 拖动中");
}else{
Log.e("-s-", "其他页 拖动中");
}
break;
case ViewPager.SCROLL_STATE_SETTLING:
isChange = true;
Log.e("-s-", "切换成功");
break;
}
}
然后我们在做一下刚才的操作
第一页往左滑动(强制到最后一页)
===> 最后一页往右滑动(强制到第一页)
===> 第一页往右滑动(到第二页)
===> 第二页往右滑动(到最后一页)
我们实现了循环操作并且生成的log如下
总结
这样实现了无限的循环,但是有一点就是因为直接从第一页或者最后一页向不能滑动的地方拖动,会发现不会出现viewpager自带的滑动距离效果。所以建议还是在首页和尾页各加一个新的页面的方法,这边只是对无限循环进行探讨。