关于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;这样当最后一页滑动到第一页的过程中,圆点就始终停留在最后一个点。