要实现效果如图:
(一)实现循环滑动:
(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,停止定时即可。
原文地址:http://blog.csdn.net/u011240877/article/details/45374259