ViewPager實現循環滑動

在網上看到了viewpager以後本身看了看,效果不錯,一樣eoe社區也有不少相關的文章,好比http://www.eoeandroid.com/forum.php?mod=viewthread&tid=157771&page=21#pid1384160,你們能夠看看,使用viewpager的時候你們不要忘了導入android-support-v4.jar這個包,本身能夠去下載。 可是在使用的時候發現以上找到的viewpager不能實現循環滑動,這對於用戶體驗可能不是太好,因此本身又開始在此基礎上尋找其餘的方法,最終發現瞭如下解決辦法: 將MyPagerAdapter修改一下:
/**
  * 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] 能夠更新數據了。嘿嘿。

相關文章
相關標籤/搜索