/** * ViewPager适配器 */ public class MyPagerAdapter extends PagerAdapter { public List<View> views; Context context; int mCount; public MyPagerAdapter(Context context,List<View> views) { this.views = views; this.context=context; mCount = views.size(); } @Override public void destroyItem(View collection, int position, Object arg2) { if (position >= views.size()) { int newPosition = position%views.size(); position = newPosition; // ((ViewPager) collection).removeView(views.get(position)); } if(position <0){ position = -position; // ((ViewPager) collection).removeView(views.get(position)); } } @Override public void finishUpdate(View arg0) { } @Override public int getCount() { return mCount+1;//此处+1才能向右连续滚动 } @Override public Object instantiateItem(View collection, int position) { if (position >= views.size()) { int newPosition = position%views.size(); position = newPosition; mCount++; } if(position <0){ position = -position; mCount--; } try { ((ViewPager) collection).addView(views.get(position), 0); } catch (Exception e) { } return views.get(position); } @Override public boolean isViewFromObject(View view, Object object) { return view == (object); } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { } @Override public Parcelable saveState() { return null; } @Override public void startUpdate(View arg0) { } } 同时若是你要的效果里面有上面连接中的那个白色的动画效果,一样也须要再修改一个地方 /** * 页卡切换监听,用于改变更画位置 */ public class MyOnPageChangeListener implements OnPageChangeListener { int one = offset * 2 + bmpW;// 页卡1 -> 页卡2 偏移量 int two = one * 2;// 页卡1 -> 页卡3 偏移量 @Override public void onPageSelected(int arg0) { Animation animation = null; if(arg0>2){ arg0=arg0%3; } switch (arg0) { case 0: if (currIndex == 1) { animation = new TranslateAnimation(one, 0, 0, 0); } else if (currIndex == 2) { animation = new TranslateAnimation(two, 0, 0, 0); } break; case 1: if (currIndex == 0) { animation = new TranslateAnimation(offset, one, 0, 0); } else if (currIndex == 2) { animation = new TranslateAnimation(two, one, 0, 0); } break; case 2: if (currIndex == 0) { animation = new TranslateAnimation(offset, two, 0, 0); } else if (currIndex == 1) { animation = new TranslateAnimation(one, two, 0, 0); } break; } currIndex = arg0; animation.setFillAfter(true);// True:图片停在动画结束位置 animation.setDuration(300); cursor.startAnimation(animation); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }
这样一来,其余地方不须要修改,便可实现viewpager的循环滑动效果php
本身继续修改了如下,发现能够实现向左无限循环(貌似是无限)的,个人方法以下 有几个方法作如下改动就好了java
@Override public void destroyItem(View collection, int position, Object arg2) { //循环滑动时此处不能销毁 // ((ViewPager) collection).removeView(views.get(position%views.size())); } @Override public void finishUpdate(View arg0) { } @Override public int getCount() { return Integer.MAX_VALUE;//设置成最大值以便循环滑动 } @Override public Object instantiateItem(View collection, int position) { try { ((ViewPager) collection).addView(views.get(position%views.size()), 0); } catch (Exception e) { } return views.get(position%views.size()); }最后再初始化页面时mPager.setCurrentItem(3*100);//设置初始页面,为0的话开始不能向左滑动
这样的话就能实现相似的无限循环(向左其实只有100次,只是通常没人会在那儿向左移动那么屡次而已)android
涉及ViewPager更新问题ide
ViewPager的PagerAdapter不能够更新数据 动画
在作项目的时候,发现即便调用了galleryAdapter.notifyDataSetChanged();this
可是ViewPager仍是不会更新原来的数据。spa
后来在stackoverflow上面找到了方法,原文连接:.net
http://stackoverflow.com/questions/7263291/viewpager-pageradapter-not-updating-the-viewrest
因而花了一点时间,修改了代码:code
protected PagerAdapter galleryAdapter = new PagerAdapter() { @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == ((View)arg1); } @Override public int getCount() { return size; } @Override public Object instantiateItem(View container, int position) { return bindGalleryAdapterItemView(container, position); } @Override public void destroyItem(View container, int position, Object object) { ((ViewPager) container).removeView((View) object); }; @Override public void finishUpdate(View arg0) {} @Override public void restoreState(android.os.Parcelable state, ClassLoader loader) { }; @Override public Parcelable saveState() { return null; } @Override public void startUpdate(View arg0) {} @Override public int getItemPosition(Object object) { return POSITION_NONE; } };
注意:POSITION_NONE 是一个PagerAdapter的内部常量,值是-2, API里面有说明: int android.support.v4.view.PagerAdapter.POSITION_NONE = -2 [0xfffffffe] 能够更新数据了。嘿嘿。