ViewPager实现循环滑动功能说明

本文详细介绍了在Android应用中使用ViewPager组件时遇到的循环滑动问题,并提供了解决方案。通过修改适配器(MyPagerAdapter)中的关键方法,实现了ViewPager的循环滑动效果。此外,还展示了如何使滑动效果无限循环,即向左无限滑动。通过调整适配器的`getCount()`方法和`instantiateItem()`方法,使得滑动效果不仅在向右滑动时循环,还能在特定情况下实现向左无限循环。同时,文章还分享了一个包含白色动画效果的页卡切换监听类(MyOnPageChangeListener),进一步丰富了用户体验。
大家可以看看,使用viewpager的时候大家不要忘了导入android-support-v4.jar这个包,自己可以去下载。 但是在使用的时候发现以上找到的viewpager不能实现循环滑动,这对于用户体验可能不是太好,所以自己又开始在此基础上寻找其他的方法,最终发现了以下解决办法: 将MyPagerAdapter修改一下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/**
   * 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的循环滑动效果

自己继续修改了以下,发现可以实现向左无限循环(貌似是无限)的,我的方法如下 有几个方法做以下改动就行了
 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@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次,只是一般没人会在那儿向左移动那么多次而已)


http://www.2cto.com/kf/201311/256446.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值