三方Android开发经验谈Android技术知识

超简单,RxJava+ViewPager实现无限轮播广告条

2016-09-13  本文已影响662人  真的是叫时光啊

先简单的聊一下ViewPager,默认它是会加载当前显示页和左右两侧的页面内容的。(所以一般使用ViewPager+Fragment的时候,尽量可以实现Fragment的懒加载,所以在这里给大家推荐一个框架Fragmention,反正我是看完这个代码感觉给自己打开了一个新天地),当然,刚才说的和本节内容一点关系也没有。
一般每一个APP上 基本都会有这么一个广告条。既然是广告条了,那就得有无限轮播的功能吧。而且我看当前还有很多人再用handler+timer在指定时间去切换线程。这样不太好吧。代码逻辑教乱。既然学了Rx当然要使用Rx来对这个事件进行操作了。而且看起来是那么简单。
我先贴Adapter的部分代码

@Override
public int getCount() {
//因为是无限轮播嘛,所以在总数量这里,欺骗一下Adapter
    return Integer.MAX_VALUE;
}

同样,因为我们改变了count,所以对应的position也是从0- Integer.MAX_VALUE了

@Override
public Object instantiateItem(ViewGroup container, int position) {
    View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.test,container,false); 
//一般我会在这里判断一下position,因为我一般是先加载布局,数据用的是一个空集合
//当我真正从服务器中拿到数据之后,我会更新一下Adaper,所以当是空数据,就不处理了
   if(lists.size() == 0){
       return view;
    }
//当从服务器获取到数据以后,开始循环,position对size取余可以得到0-size
    position %= lists.size();
    TextView tv = (TextView) view.findViewById(R.id.tv);
    tv.setText(lists.get(position).getText());
    container.addView(view);
    return view;
}

至此,Adaper需要注意的地方就结束了。
先看一下这两个方法

//注册Rx事件,interval这个操作符是xx时间后做yy事
public void register(){
    subscribe = Observable.interval(2, TimeUnit.SECONDS)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<Long>() {
                @Override
                public void call(Long aLong) {
                    //每过两秒我就展示的ViewPager当前页的下一页
                    mPager.setCurrentItem(mPager.getCurrentItem()+1,true);
                    //如果你们不调用unRegister,你们可以看看当程序退出之后,你们的Toast打印出来的数,能打到多少
                    Toast.makeText(MainActivity.this, "aLong="+aLong, Toast.LENGTH_SHORT).show();
                }
            });}
//取消Rx事件
public void unRegister(){
    if(subscribe != null && !subscribe.isUnsubscribed()) 
       subscribe.unsubscribe();
}

我一般会在生命周期的方法里面去调用注册和取消注册的方法。比如onResume和onPause
同时,mPager最好在设置完ViewPager后就指定显示再1000页。这样用户进去就可以左滑了。
同时

mPager.setAdapter(adapter);
mPager.setCurrentItem(10000,false);
mPager.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
//监听ViewPager的触摸事件,当用户按下的时候取消注册,当用户手抬起的时候再注册,这样效果就完美了
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                unRegister();
                break;
            case MotionEvent.ACTION_UP:
                register();
                break; 
       }
        return false;
    }});

其实这篇文章水的毫无意义,唯一的意义也许就是向大家推荐了Fragmention,这真的非常不错,虽然和本文一点关系都没有。
给大家推荐两篇文章:
RX用法大集合:
http://blog.csdn.net/theone10211024/article/details/50435325
Fragmention作者的简书:
http://www.jianshu.com/users/6b372d09b617/latest_articles

上一篇 下一篇

猜你喜欢

热点阅读