用ViewPager来实现轮播,会考虑到无限轮播和左右循环,需要做到以下5步:
//1.把图片的总数改为整数的最大值,做为虚假的图片数量
//2.在用到position的地方进行%运算,这样可以保证得到的position的不会数组越界
//3.设置虚假图片位置的起点为整数最大值的中间
//4.算出真正图片位置与起点的偏差值
//5.整数最大值的中间-真正图片位置与起点的偏差值
//1.把图片的总数改为整数的最大值,做为虚假的图片数量
//2.在用到position的地方进行%运算,这样可以保证得到的position的不会数组越界
//3.设置虚假图片位置的起点为整数最大值的中间
//4.算出真正图片位置与起点的偏差值
//5.整数最大值的中间-真正图片位置与起点的偏差值
/*================================= 适配器的设置 =================================*/
class PictureAdapter extends PagerAdapter {
@Override
public int getCount() {
// TODO
if (mData != null) {
//1.把图片的总数改为整数的最大值,做为虚假的图片数量
return Integer.MAX_VALUE;
}
return 0;
}
@Override
public boolean isViewFromObject(View view, Object object) {
// TODO
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
// TODO
//2.在用到position的地方进行%运算,这样可以保证得到的position的不会数组越界
//position(真正的图片位置) = position(虚假的图片位置) % mData.size()(图片数量);
position = position % mData.size();
ImageView iv = new ImageView(UIUtils.getContext());
iv.setImageResource(R.drawable.ic_default);
String url = URLS.IMAGEBASEURL + mData.get(position);
BitmapHelper.display(iv, url);
container.addView(iv);
return iv;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO
container.removeView((View) object);
}
}
/*================================= viewPager的触摸事件设置 =================================*/
// 设置viewpager的滑动事件
mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// TODO
//2.在用到position的地方进行%运算,这样可以保证得到的position的不会数组越界
//position(真正的图片位置) = position(虚假的图片位置) % mData.size()(图片数量);
position = position % mData.size();
for (int i = 0; i < mData.size(); i++) {
View indicatorView = mContainer.getChildAt(i);
indicatorView
.setBackgroundResource(R.drawable.indicator_normal);
if (i == position) {
indicatorView
.setBackgroundResource(R.drawable.indicator_selected);
}
}
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
// TODO
}
@Override
public void onPageScrollStateChanged(int state) {
// TODO
}
});
//4.算出真正图片位置与起点的偏差值
int diff = Integer.MAX_VALUE / 2 % mData.size();
//3.设置虚假图片位置的起点为整数最大值的中间,这样可以使得轮播一开始从可以划到左边的效果,但是可能出现获取到的真正图片位置不是从0开始的现象,所以要算出真正图片位置与起点的偏差值
mViewPager.setCurrentItem(Integer.MAX_VALUE / 2 - diff);