ViewPager实现无限循环

现在很多的应用首页都有一个自动轮播的广告栏,比较高级复杂点的实现就是自定义view,那个真心复杂,目前还驾驭不了,有兴趣的童鞋可以参考android中左右滑屏的实现(广告位banner组件)这是我在任玉刚大神博客里翻出来的。还有一种比较简洁的实现就是通过ViewPager实现,ViewPager的使用大家应该都没什么问题,关键解决以下几个问题:

  1. 如何实现无限循环
  2. 如何实现自动翻页

如何实现无限循环

关于无限循环我之前看到过一种实现,就是在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下一个界面准备好的时候会调用这个方法,在这个方法里面我们要做一些小处理:

    @Override
    public void finishUpdate(ViewGroup container) {
        int position = mViewPager.getCurrentItem();
        Log.d(TAG, "=======finishUpdate()======position======" + position);
        if (position == 0) {
            position = mBannerSize;
            mViewPager.setCurrentItem(position, false);
        } else if (position == mTotalSize - 1) {
            position = mBannerSize - 1;
            mViewPager.setCurrentItem(position, false);
        }
        Log.d(TAG, "finish update after, position=" + position);
    }

当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()方法:
    private Handler handler = new Handler();  

    private Runnable task =new Runnable() {  
       public void run() {  
           // TODOAuto-generated method stub
             handler.postDelayed(this,5*1000);//设置延迟时间,此处是5秒
              //需要执行的代码
       }   
    };

    //在其他方法中调用
    handler.postDelayed(task,5000);//延迟调用
  • Timer
    private Timer mTimer = new Timer();

    public TimerTask mTimerTask = new TimerTask() {
        @Override
        public void run() {
            //需要执行的代码
        }
    };

    //在其他方法中调用
    mTimer.schedule(mTimerTask, 5000, 5000);
  • ScheduledExecutorService
    private ScheduledExecutorService = mExecutorExecutors.newSingleThreadScheduledExecutor();

    public TimerTask mTimerTask = new TimerTask() {
        @Override
        public void run() {
            //需要执行的代码
        }
    };

    //在其他方法中调用
    mExecutor.scheduleAtFixedRate(mTimerTask, 5, 5, TimeUnit.SECONDS);

使用Timer的时候记得在Activity的onDestroy()中加上mTimer.cancel()使用ScheduledExecutorService的时候记得在Activity的onDestroy()中加上mExecutor.shutdownNow()否则会造成内存泄漏哦!我使用的是ScheduledExecutorService,至于原因,大家可以看看鸿阳大神的Java 并发专题 : Timer的缺陷 用ScheduledExecutorService替代

具体代码如下:点击获取源码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值