viewpager无限左右滑动

原创 2015年07月08日 17:25:27

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


相关文章推荐

Fragment静态传值(RecyclerView,接口回调)

效果图: 布局 : activity:
  • yy_nn
  • yy_nn
  • 2017年05月02日 14:30
  • 269

Android高仿京东淘宝自动无限循环轮播控件的实现思路和过程

Android高仿京东淘宝自动无限循环轮播控件的实现思路和过程在App的开发中,很多的时候都需要实现类似京东淘宝一样的自动无限轮播的广告栏,所以就自己写了一个,下面是我自定义控件的思路和过程。一、自定...

自定义通用viewpager(左右无限滑动,自动轮播)

先看一下效果图(左右无限滑动,自动轮播)地铁上看了一个大神的博客,自定义了通用viewpager,但是没有自动轮播和左右无限滑动功能,自己尝试写了一下。在这给大家分享一下,也给大神传播一下自定义控件的...

ViewPager无限循环左右滑动效果

  • 2016年06月15日 11:11
  • 2.41MB
  • 下载

使用ViewPager实现左右“无限”滑动的万年历

有时候就是这样,研究一个问题,一开始想到了一个觉得可行的方案,然后去尝试;尝试了很久、很多次,已经要放弃了,关掉电脑心里 想这个需求没办法实现;在去上厕所的路上突然想到了一个点子,第二天一试,尼玛,搞...

ViewPager实现真正的左右无限循环滑动

最近由于项目需要需要实现类似于广告那种
  • ywl5320
  • ywl5320
  • 2014年11月04日 22:57
  • 2584

Android 使用ViewPager真正实现左右无限滑动(附源码)

前言         网上有很多使用ViewPager实现左右滑动这一效果的资料,这些资料大多数都是将PagerAdapter中getCount()方法的返回值设为Integer.MAX_V...

Android ViewPager 无限循环左右滑动(可自动) 实现

对于ViewPager 广告页 这个功能 很多APP都有这个功能 在网上也看过一些资料,我就在这把我自己完整的实现方法写出来吧 Demo放在最下面 基础的ViewPager: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:viewpager无限左右滑动
举报原因:
原因补充:

(最多只允许输入30个字)