viewpager无限循环与ViewPagerIndicator

关于android的轮播。由于使用到了ViewPagerIndicator这个开源控件

发现ViewPagerIndicator是根据ViewPager中数据的数量来生成,所以如果需要一个可以无限循环的ViewPagerIndicator

那么就会出现错误。首先程序会崩溃,然而,即使不崩溃。也不是我们想要的效果。因为我们根本不需要那么多的点,

我们只需要在几张图片之间切换。

这个时候我去网路上找相应的解决方法。其中一种是放弃ViewPagerIndicator,自己使用imageview动态生成指示的圆点。

但是我实在是觉得ViewPagerIndicator很棒。效果好看。而且可以使用条形,圆形等各种形状。用起来十分的方便啊。(不知道是哪位大神的杰作)

所以不舍得放弃。之后就是网上找到了和可以完美兼容ViewPagerIndicator的方法。但是蔽人真的是才疏学浅,并没有看的十分明白(-_-|||)

于是自己想办法。想到了一个比较笨拙的解决的方式,顺着自己的思路解决掉了。

在这里。首先看了ViewPagerIndicator的CirclePageIndicator的源代码的ondraw方法中看到

        final int count = mViewPager.getAdapter().getCount();
        if (count == 0) {
            return;
        }


这段代码,这里发现ViewPagerIndicator生成圆点数量是依据关联的ViewPager的适配器的getCount()方法返回的int值。

所以首先要让这个值的数量是真实的数据数量。然后还有一个问题,ViewPagerIndicator会根据CurrentItem来显示当前被选择的点

如果不做任何处理,那么翻到最后一页。势必会崩溃,而不是回到第一页。然后又不能如刚才按照之前的思路,在适配器中改变让返回的值不同,

因为要实现循环翻页的话,一定要让CurrentItem的值增加,让CurrentItem的最大长度等于一个尽可能大的数Integer.MAX。

所以我这里做了个简单的改动

        if (mViewPager == null) {
            return;
        }
        final int count = mViewPager.getAdapter().getCount();
        if (count == 0) {
            return;
        }
        mCurrentPage%=count;
        if (mCurrentPage >= count) {
            setCurrentItem(count - 1);
            return;
        }


这里增加一句mCurrentPage%=count ;和viewpager循环翻页的时候防止越界是一个思路。就这样简单处理了一下

然后说一下PagerAdapter和ViewPager中的改动,这里的方式就比较笨拙了。

这里在ViewPager的子类中覆盖了getAdapter方法

	@Override
	public PagerAdapter getAdapter() {
		// TODO Auto-generated method stub
		return ((ImagePagerAdapter) super.getAdapter()).getCopyAdapter();
	}


在PagerAdapter的子类中增加一个PagerAdapter类型的变量copy,提供返回这个变量的方法,getCopyAdapter();

	private PagerAdapter copy = new PagerAdapter() {

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			// TODO Auto-generated method stub
			return false;
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return views.size();
		}
		public int getItemPosition(Object object) {
			return pos;
		};
	};
	public PagerAdapter getCopyAdapter(){
		return copy;
	}


在变量copy的getCount()方法中返回真实的图片数据的数量。

自己觉得这个方法笨拙直观。多次测试没有问题。觉得还是可行的。^_^


PS:这里由于做的图片轮播。使用的是ViewPagerIndicator的CirclePageIndicator,CirclePageIndicator有个滑动过程中小圆点平移的效果。

这样用于轮播的时候。滑动到最后的时候出现平移动画不太美观。这里在源代码里做了简单的修改


      if (!mSnap&&!(mCurrentPage==count-1)) {
            cx += mPageOffset * threeRadius;
        }
这个是绘制的时候的偏移的长度,在判断的时候增加mCurrentPage==count-1;这样当最后一页滑动到第一页的过程中,圆点就始终停留在最后一个点。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值