超シンプル、RxJava+ViewPagerで無限のマルチキャスト広告を実現

2771 ワード

まず簡単にViewPagerについて話しますが、デフォルトでは現在の表示ページと左右のページの内容がロードされます.(だから一般的にViewPager+Fragmentを使うときは、できるだけFragmentの怠惰なロードを実現できるようにするので、ここではフレームワークFragmentionをお勧めします.どうせ私はこのコードを見て自分に新しい天地を開いたような気がします)もちろん、さっき言ったのは本節の内容とは少しも関係ありません.一般的に各アプリには基本的にこのような広告があります.広告板である以上、無限に放送する機能が必要だろう.また、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の注意点は終わりです.まずこの2つの方法を見てみましょう
// Rx ,interval xx yy 
public void register(){
    subscribe = Observable.interval(2, TimeUnit.SECONDS)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1() {
                @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はView Pagerを設定した後に表示を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/50435325Fragmentionの作者:http://www.jianshu.com/users/6b372d09b617/latest_articles