最近在学习的时候碰到了ViewPager的无限滑动问题,百度了一下,在一篇文章上看到了一张图,然后恍然大悟,图片在下面,贴上原图地址http://www.cnblogs.com/xinye/archive/2013/06/09/3129140.html
然后下面是我自己写的一个无限滑动的例子,下面这是一个PagerAdapter,需要传进一个图片链接数组
package com.example.admin.kaolafm.discover.adapter; import android.content.Context; import android.support.v4.view.PagerAdapter; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import com.nostra13.universalimageloader.core.ImageLoader; import java.util.ArrayList; import java.util.List; /** * ViewPager的每一页只有一张图片的情况下使用这个adapter * Created by admin on 2016/8/11. */ public class ImageViewAdapter extends PagerAdapter { //用一个数组来保存imageview,并在imageview设置图片 private List<ImageView> viewList = new ArrayList<>(); private Context context; private List<String> urlList; public ImageViewAdapter(Context context, List<String> data) { this.context = context; this.urlList = data; } @Override public int getCount() { return urlList == null ? 0 : (urlList.size() + 2); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { ImageView imageView; //这里是为了传数据只需要传图片链接所写的ImageView的创建 if (viewList.size() == (urlList.size() + 2)) { imageView = viewList.get(position); } else { imageView = new ImageView(context); container.addView(imageView); if (position == 0) { ImageLoader.getInstance().displayImage(urlList.get(urlList.size() - 1), imageView); } else if (position == urlList.size() + 1) { ImageLoader.getInstance().displayImage(urlList.get(0), imageView); } else { ImageLoader.getInstance().displayImage(urlList.get(position - 1), imageView); } imageView.setScaleType(ImageView.ScaleType.FIT_XY); viewList.add(imageView); } //如果图片因为网络原因没有下载下来,在这里在此下载 if (viewList.get(position).getDrawable() == null) { if (position == 0) { ImageLoader.getInstance().displayImage(urlList.get(urlList.size() - 1), imageView); } else if (position == urlList.size() + 1) { ImageLoader.getInstance().displayImage(urlList.get(0), imageView); } else { ImageLoader.getInstance().displayImage(urlList.get(position - 1), imageView); } } return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { //因为没有一直添加控件,所以不需要移除 // ImageView imageView = viewList.get(position); // container.removeView((View) object); } }下面是Activity中ViewPager的监听
ImageViewAdapter imagePagerAdapter = new ImageViewAdapter(getContext(), urlList); viewPager.setAdapter(imagePagerAdapter); //这里默认显示第一页,ViwePager下标从零开始 viewPager.setCurrentItem(1, false); viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { //因为这里是采用cabca的形式,所以默认显示a,所以滑动到第二个a的时候让页面无效果跳到第一个a; // 同理,如果往右滑动,从第一个a滑动到第一个c的时候,需要无跳动效果的跳到第二个c,这样就实现了无限滑动 if (position == urlList.size() + 1) { viewPager.setCurrentItem(1, false); //将tabLayout滑块绑定到viewPager tabLayout.setScrollPosition(0, positionOffset, true); } else if (position == 0 && positionOffset == 0) { viewPager.setCurrentItem(urlList.size(), false); tabLayout.setScrollPosition(urlList.size() + 1, positionOffset, true); } else { tabLayout.setScrollPosition(position - 1, positionOffset, true); } } @Override public void onPageSelected(int position) { //手动滑动 更新position playPosition = position; } @Override public void onPageScrollStateChanged(int state) { } });新手写的代码比较渣,还望路过的各路大神指导一下