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");
}
});