/** * 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] 能夠更新數據了。嘿嘿。