要实现效果如图:
(一)实现循环滑动:
(1)在MyAdapter中首先修改getCount()方法中的大小,让ViewPager可滑动页面增多。
(2)instantiateItem()方法中将position对图片数组求余:position%imageList.size()
(3)如果viewPager设置了OnPagerChangedListener方法,里面可能会有position,注意将position求余,否则可能会由于position作索引下标导致数组溢出异常。
(4)以上操作只能右循环,要实现左循环,只需把初始位置设置为getCount()方法中返回大小的一半,那样我们就可以向左滑
(注意:这只是看起来循环,实际上只不过是N个View在重复这5中View。
如下:0,1,2,3,4,5,0,1,2,3,4,5,0,1,2,3,4,5.....0,1,2,3,4,5)
代码如下:
private class MyAdapter extends PagerAdapter{
/**
* 返回viewPager元素数量
*/
@Override
public int getCount() {
return imageList.size()*100;
}
/**
* 实例化一个元素
*/
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(imageList.get(position%imageList.size()));
return imageList.get(position%imageList.size());
}
/**
* 判断是否相等
*/
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO 自动生成的方法存根
return arg0 == (View)arg1;
}
/**
* 销毁元素
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO 自动生成的方法存根
container.removeView((View) object);
object = null;
}
}
(二)实现自动滚动,设定一个定时器
/*
* 自动循环有多种实现方式:
* 1、定时器:Timer
* 2、开子线程 while true 循环
* 3、ColckManager
* 4、 用handler 发送延时信息,实现循环
*/
这里我们用第四种,比较高效:
<span style="white-space:pre"> </span>//判断是否自动滚动的标志
private boolean isrunning = false;
/**
* 自动滑动的Handler
* 利用 Handler.sendEmptyMessageDelayed方法,实现定时滚动
*
*/
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
//让ViewPager滑到下一页
viewPager.setCurrentItem(viewPager.getCurrentItem()+1);
//延时,循环调用handler
if(isrunning){
handler.sendEmptyMessageDelayed(0, 2000);
}
};
};
/**
* Activity生命周期结束时终止定时,否则可能一直进行下去
*/
protected void onDestroy() {
super.onDestroy();
isrunning = false;
};
在onCreate()方法中发送一个消息启动Handler。
handler.sendEmptyMessageDelayed(0, 2000);
为了在Activity生命周期结束时终止定时器,重写onDestory方法,里面将定时器标志置为false,停止定时即可。
【ViewPager的学习】二、添加图片描述及指示点动态改变