现在很多的应用首页都有一个自动轮播的广告栏,比较高级复杂点的实现就是自定义view,那个真心复杂,目前还驾驭不了,有兴趣的童鞋可以参考android中左右滑屏的实现(广告位banner组件)这是我在任玉刚大神博客里翻出来的。还有一种比较简洁的实现就是通过ViewPager实现,ViewPager的使用大家应该都没什么问题,关键解决以下几个问题:
- 如何实现无限循环
- 如何实现自动翻页
如何实现无限循环
关于无限循环我之前看到过一种实现,就是在ViewPager子类的getcount()中返回一个很大的值,比如Integer.MAX_VALUE,据说使用这个值有可能产生ANR,具体没试过,本文也不讨论这个问题,有兴趣的童鞋可以试试。
现在开始讲讲我的实现,这个方式也是从任大神的博客中学来的,开篇博客回忆巩固一下,参考循环广告位组件的实现。好,开始说正题,这个方式的思路主要是:ViewPager子类的getcount()中返回的值设置成Viewpager的栏目数mBannerSize的整数倍,记为mTotalSize。mTotalSize的值最好不要太大,200-1000就够用了,我设置的是50倍,即mTotalSize = mBannerSize * 50;
然后就要讲ViewPager子类的一个复写方法finishUpdate (ViewGroup container)。API的解释是:Called when the a change in the shown pages has been completed. At this point you must ensure that all of the pages have actually been added or removed from the container as appropriate.就是Viewpager下一个界面准备好的时候会调用这个方法,在这个方法里面我们要做一些小处理:
当position等于0的时候,将ViewPager的item设置为mBannerSize,这样有什么用处呢?很有用处的哦,这样的话我就可以在一开始的时候直接往左划,item已经设置为mBannerSize了嘛,所以不会到左边的边际,这就解决了无限往左滑动的问题。
那么无限往右划呢?听我慢慢道来,当position小于我们的mTotalSize的时候,往右划是正常的流程,一但当item等于mTotalSize-1的时候,我们就将item设置成mBannerSize-1,因为mTotalSize是mBannerSize的整数倍,所以(mTotalSize-1)%mBannerSize等于mBannerSize-1,也就是说mTotalSize-1对应的界面和mBannerSize-1对应的界面其实是一样的,再通过mViewPager.setCurrentItem(position, false)偷偷把界面换回来,这样右边也就相当于没有边际了。
如何实现自动翻页
实现自动翻页的方法有很多,比如:
- handler的postDelayed()方法:
- Timer
- ScheduledExecutorService
使用Timer的时候记得在Activity的onDestroy()中加上mTimer.cancel()使用ScheduledExecutorService的时候记得在Activity的onDestroy()中加上mExecutor.shutdownNow()否则会造成内存泄漏哦!我使用的是ScheduledExecutorService,至于原因,大家可以看看鸿阳大神的Java 并发专题 : Timer的缺陷 用ScheduledExecutorService替代。
具体代码如下:点击获取源码