RxBinding使用

RxBinding地址: https://github.com/JakeWharton/RxBinding
RxJava操作符大全:https://www.jianshu.com/p/12883e1b59f9
依赖RxBinding就不需要再依赖RxJava了,内部已经包含了

一:RxView

btnLogin:为触发事件的控件
1.点击事件(可以预防重复点击)

//此处设置点击间隔为 2s  TimeUnit.SECONDS 表示以秒为单位
RxView.clicks(btnLogin)
            .throttleFirst(2, TimeUnit.SECONDS)
            .subscribe(new Consumer<Object>() {
                @Override
                public void accept(Object o) throws Exception {
                    Toast.makeText(MainActivity.this, "11111111111", Toast.LENGTH_LONG).show();
                }
            });

throttleFirst(long windowDuration, TimeUnit unit),设置一定时间内只响应首次(throttleFirst)或者末次(throttleLast)的点击事件。windowDuration为防抖时间,unit为时间单位。

2.长按监听

RxView.longClicks(btnLogin)
            .subscribe(new Consumer<Object>() {
                @Override
                public void accept(Object o) throws Exception {
                    Toast.makeText(MainActivity.this, "2222222222", Toast.LENGTH_LONG).show();
                }
            });

3.绘制监听

//当btnLogin绘制时触发
  RxView.draws(btnLogin)
            .subscribe(new Consumer<Object>() {
                @Override
                public void accept(Object o) throws Exception {

                }
            });

4.拖拽监听

    //拖拽监听
    RxView.drags(btnLogin)
            .subscribe(new Consumer<DragEvent>() {
                @Override
                public void accept(DragEvent dragEvent) throws Exception {
                    Toast.makeText(MainActivity.this, "被拖拽了", Toast.LENGTH_LONG).show();
                }
            });

5.滑动时监听

//滑动时触发
    RxView.scrollChangeEvents(btnLogin)
            .subscribe(new Consumer<ViewScrollChangeEvent>() {
                @Override
                public void accept(ViewScrollChangeEvent viewScrollChangeEvent) throws Exception {

                }
            });

二:RxTextView

1.textChanges EditText输入监听

//userNameEt:为EditText控件
RxTextView.textChanges(userNameEt).subscribe(new Consumer<CharSequence>() {
        @Override
        public void accept(CharSequence text) throws Exception {
            Toast.makeText(MainActivity.this, "2222222222", Toast.LENGTH_LONG).show();
            clearContent.setVisibility(TextUtils.isEmpty(text) ? View.INVISIBLE : View.VISIBLE);
        }
    });
// 带 控件操作时间间隔 的输入监听,就是每次输入的事件监听之间的间隔事件必须大于 1200ms(1s20ms) 
//这个可以用在搜索功能上,每隔 1.2s 查询一次数据
RxTextView.textChanges(userNameEt)
             .debounce(1200, TimeUnit.MILLISECONDS)
             //切换线程到主线程
             .observeOn(AndroidSchedulers.mainThread())
             //CharSequence转换为String
             .map(CharSequence::toString)
             .subscribe(new Consumer<CharSequence>() {
                @Override
                public void accept(CharSequence charSequence) throws Exception {
                    log("debounce");
                }
            });

也可以结合 RxJava 操作符对输入的数据进行一些操作,例如通过 map 将输入的文本转为String

map : 将被观察者发送的事件转换为任意的类型事件

RxTextView.textChanges(userNameEt)
                .map(new Function<CharSequence, String>() {
                    @Override
                    public String apply(CharSequence charSequence) throws Exception {
                        return String.valueOf(charSequence);
                    }
                }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
            }
        });

再举一个比较复杂的例子,再登陆的时候进行表单验证,当账号和密码格数输入正确后让登陆按钮才可以点击

combineLatest操作符:这个操作符可以结合两个Observable的数据源进行输出,这个正好我们这里需要验证输入的name和password两个数据源,验证通过才让按钮可以点击登录

在subscribe中接收到aBoolean==true 时登陆按钮可以使用

private void rxEditText() {
        Observable.combineLatest(
        //账号的输入监听
        RxTextView.textChanges(mEditName).map(new Function<CharSequence, String>() {
            @Override
            public String apply(CharSequence charSequence) throws Exception {
                return String.valueOf(charSequence);
            }
        }), 
        //密码的输入监听
        RxTextView.textChanges(mEditPwd).map(new Function<CharSequence, String>() {
            @Override
            public String apply(CharSequence charSequence) throws Exception {
                return String.valueOf(charSequence);
            }
        }), 
        new BiFunction<String, String, Boolean>() {
            @Override
            public Boolean apply(String name, String password) throws Exception {
                return isNameValid(name) && isPwdValid(password);
            }
        }).subscribe(new Consumer<Boolean>() {
            @Override
            public void accept(Boolean aBoolean) throws Exception {
                if (aBoolean) {
                    mBtnLogin.setEnabled(true);
                    RxView.clicks(mBtnLogin).subscribe(new Consumer<Object>() {
                        @Override
                        public void accept(Object o) throws Exception {
                            Toast.makeText(MainActivity.this, "Login Success!", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            }
        });
    }

    private boolean isNameValid(String name) {
        return "RxBind".equals(name);
    }

    private boolean isPwdValid(String pwd) {
        return "123".equals(pwd);
    }

2.textChangeEvents(内部同样封装了TextWatcher文本改变监听。不同的是其返回数据的类型为TextViewTextChangeEvent,内部包含详细的文本改变数据。)

RxTextView.textChangeEvents(userNameEt)
    .subscribe(textViewTextChangeEvent -> {
        Log.e("rx_binding_test", "textChanges:文本改变了:" + "before:" + textViewTextChangeEvent.before() + 
            ",start:" + textViewTextChangeEvent.start() + ",text:" + textViewTextChangeEvent.text() + 
            ",count:" + textViewTextChangeEvent.count());
    });

3.editorActions(内部封装了OnEditorActionListener软键盘回车点击监听)

RxTextView.editorActions(userNameEt)
      .subscribe(integer -> {
        Log.e("rx_binding_test", "editorActions:输入完毕,点击回车:");
    });

4.editorActionEvents(内部同样封装了OnEditorActionListener软键盘回车点击监听。不同的是它的返回类型为TextViewEditorActionEvent,包含actionId,keyEvent等信息)不怎么常用,用第3个就够了

RxTextView.editorActionEvents(userNameEt)
       .subscribe(textViewEditorActionEvent -> {
        KeyEvent keyEvent = textViewEditorActionEvent.keyEvent();
        //判断up状态
        if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_ENTER && keyEvent.getAction() == KeyEvent.ACTION_UP) {
            Log.e("rx_binding_test", "editorActionEvents:输入完毕,点击回车:" + textViewEditorActionEvent.keyEvent());
        }
    });

5.setText()、setHint()、setTextColor()

RxTextView.text(etRxTextView).accept("我要涨工资");
RxTextView.hint(etRxTextView).accept("请输入金额");
RxTextView.color(etRxTextView).accept(Color.parseColor("#00ff00"));

三.RxCompoundButton

1.checkedChanges选中状态改变事件监听

//cbContract checkbox控件
RxCompoundButton.checkedChanges(cbContract)
    .subscribe(aBoolean -> {
        RxView.enabled(btnLogin).accept(aBoolean);
        btnLogin.setBackgroundResource(aBoolean ? R.color.colorPrimary : R.color.colorGray);
        RxTextView.color(btnLogin).accept(aBoolean ? Color.parseColor("#ffffff") :
                Color.parseColor("#000000"));
    });

进阶操作

1.合并监听

Observable<CharSequence> userNameObservable = RxTextView.textChanges(userNameEt);
    Observable<CharSequence> userPwdObservable = RxTextView.textChanges(userPasswordEt);
    // 相当于合并
    Observable.combineLatest(userNameObservable, userPwdObservable,
            new BiFunction<CharSequence, CharSequence, Object>() {
                @Override
                public Object apply(CharSequence userName, CharSequence userPwd) throws Exception {
                    Toast.makeText(MainActivity.this, "33333", Toast.LENGTH_LONG).show();
                    // 设置按钮是否可用(或者改变背景颜色)
                    clearContent.setEnabled(!TextUtils.isEmpty(userName) && !TextUtils.isEmpty(userPwd));
                    return null;
                }
            });

2.按钮点击分发多个事件
点击一个按钮实现多个监听(就是点击了一个按钮在多个地方收到通知)

1.RxView.clicks(mBtnEvent).share()首先需要使用share这个操作符
2.通过CompositeDisposable订阅多个Disposable

        Observable<Object> observable = RxView.clicks(mBtnEvent).share();
        CompositeDisposable compositeDisposable = new CompositeDisposable();

        Disposable disposable1 = observable.subscribe(new Consumer<Object>() {
            @Override
            public void accept(Object o) throws Exception {
                Log.d(TAG, "disposable1, receive: " + o.toString());
            }
        });
        Disposable disposable2 = observable.subscribe(new Consumer<Object>() {
            @Override
            public void accept(Object o) throws Exception {
                Log.d(TAG, "disposable2, receive: " + o.toString());
            }
        });
        
        compositeDisposable.add(disposable1);
        compositeDisposable.add(disposable2);

3.ListView点击事件(为ListView绑定点击监听事件,可以监听到点击了哪一项)

        ArrayList<String> datas = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            datas.add("rxList " + i);
        }
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_expandable_list_item_1, datas);
        mListView.setAdapter(adapter);

        RxAdapterView.itemClicks(mListView).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Toast.makeText(MainActivity.this, "List Item Clicked, Position = " + integer, Toast.LENGTH_LONG).show();
            }
        });

.轮询操作(RXJava)

    // 轮询操作
    Observable.interval(2, 2, TimeUnit.SECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<Long>() {
        @Override
        public void accept(Long aLong) throws Exception {
            log("interval");
        }
    });

.延时操作(RXJava)

    // 延时操作
    Observable.timer(2, TimeUnit.SECONDS)
            .subscribe(new Consumer<Long>() {
                @Override
                public void accept(Long aLong) throws Exception {
                    log("timer");
                }
            });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值