给自己的忠告:虽然轮子很好用,但是使用轮子的前提是:如果不去封装一些复杂的功能,自己会用最基本的方法写一个,不然再好的轮子那也是别人的,当自己项目遇到和轮子不一样的地方,那就只能束手无策或者改人家的源码,当然能看懂轮子的封装思想自己学以致用并且能够很轻松的更改源码那是最好不过的了。
1. 实现思路
两种方案:
(1)采用Adapter内的getCount()方法返回Integer.MAX_VALUE。
(2)在列表的最前面插入最后一条数据,在列表末尾插入第一个数据,造成循环的假象
2. 具体实现
2.1 方案一:getCount()返回Integer.MAX_VALUE
2.1.1 ViewPager无限循环
在ViewPager的Adapter内的getCount方法中,返回一个很大的数Integer.MAX_VALUE,理论上可以无限滑动。当显示完一个真实列表的周期后,又从真实列表的0位置显示数据,造成无限循环轮播的假象。因为ViewPager第一页不能向左滑动循环,所以我们要通过mViewPager.setCurrentItem(Integer.MAX_VALUE/2)设置选中的位置,这样最开始就可以向左滑动,但是因为要显示第一页所以该值%数据个数==0。因为设置为Integer.MAX_VALUE后会在setCurrentItem()的时候发生ANR,所以这里使用一个自定义的较大的数比较好,这里我是用500
//当前选中页
private int currentPosition;
//数据项个数
private List itemList;
public static final int mLooperCount = 500;
//设置当前选中的item
currentPosition = getStartItem();
viewPager1.setCurrentItem(currentPosition1);
private int getStartItem(){
if(getRealCount() == 0){
return 0;
}
// 我们设置当前选中的位置为Integer.MAX_VALUE / 2,这样开始就能往左滑动
// 但是要保证这个值与getRealPosition 的 余数为0,因为要从第一页开始显示
int currentItem =BannerAdapter.mLooperCount / 2;
if(currentItem % getRealCount() ==0 ){
return currentItem;