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] 能够更新数据了。嘿嘿。

相关文章
相关标签/搜索