RxBinding是Rxjava响应式开发的一种扩展,他是更高效的处理组件事件的插件工具包。
第一步:引入包
compile 'com.jakewharton.rxbinding:rxbinding-design:0.4.0'
备注:
一定要在onDestory()中进行解绑,否则导致内存泄漏,或者使用RxLifecycle处理。
第二步:开干
1)Button的点击事件处理:
RxView.clicks(button).subscribe(new Action1<Void>() { @Override public void call(Void aVoid) { Toast.makeText(MainActivity.this, "点击 ",Toast.LENGTH_SHORT).show(); } });
2)将editText 输入的文本倒叙展示到button上
/** * 将editText 输入的文本倒叙展示到button上 */ RxTextView.textChanges(editText) .map(new Func1<CharSequence, String>() { @Override public String call(CharSequence charSequence) { return new StringBuilder(charSequence).reverse().toString(); } }) .subscribe(new Action1<String>() { @Override public void call(String s) { button.setText(s); } });
3)点击事件 点击完成后,5秒后方可再次点击button,按钮去抖动
/** * 点击事件 点击完成后,5秒后方可再次点击 */ RxView.clicks(button) .throttleFirst(5, TimeUnit.SECONDS) .subscribe(new Action1<Void>() { @Override public void call(Void aVoid) { Toast.makeText(MainActivity.this, "点击 ",Toast.LENGTH_SHORT).show(); } });
4)长按监听
/** * 长按监听 */ RxView.longClicks(button) .subscribe(new Action1<Void>() { @Override public void call(Void aVoid) { Toast.makeText(MainActivity.this, "点击 ",Toast.LENGTH_SHORT).show(); } });
5)listview的点击事件
/** * listview的点击事件 */ RxAdapterView.itemClicks( listView ) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Toast.makeText(MainActivity.this, "点击 ",Toast.LENGTH_SHORT).show(); } }) ;
6)checkBox勾选让button变高亮
/** *checkBox勾选让button变高亮 */ button = (Button) findViewById( R.id.login_bt ); checkBox = (CheckBox) findViewById( R.id.checkbox ); RxCompoundButton.checkedChanges( checkBox ) .subscribe(new Action1<Boolean>() { @Override public void call(Boolean aBoolean) { button.setEnabled( aBoolean ); button.setBackgroundResource( aBoolean ? R.color.button_yes : R.color.button_no ); } }) ;
7)搜索的时候,关键词联想功能 。debounce()在一定的时间内没有操作就会发送事件。
/** * 搜索的时候,关键词联想功能 。debounce()在一定的时间内没有操作就会发送事件。 */ editText = (EditText) findViewById( R.id.editText ); listView = (ListView) findViewById( R.id.listview ); final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1 ); listView.setAdapter( adapter ); RxTextView.textChanges( editText ) .debounce( 600 , TimeUnit.MILLISECONDS ) .map(new Func1<CharSequence, String>() { @Override public String call(CharSequence charSequence) { String key = charSequence.toString() ; return key ; } }) .observeOn( Schedulers.io() ) .map(new Func1<String, List<String>>() { @Override public List<String> call(String keyWord ) { //get list List<String> dataList = new ArrayList<String>() ; if ( ! TextUtils.isEmpty( keyWord )){ for ( String s : getData() ) { if (s != null) { if (s.contains(keyWord)) { dataList.add(s); } } } } return dataList ; } }) .observeOn( AndroidSchedulers.mainThread() ) .subscribe(new Action1<List<String>>() { @Override public void call(List<String> strings) { adapter.clear(); adapter.addAll( strings ); adapter.notifyDataSetChanged(); } }) ;
8)获取验证码倒计时
verifyCodeObservable = RxView.clicks(button) .throttleFirst(10,TimeUnit.SECONDS) .subscribeOn(AndroidSchedulers.mainThread()) .doOnNext(new Action1<Void>() { @Override public void call(Void aVoid) { RxView.enabled(button).call(false); } }); verifyCodeObservable.subscribe(new Action1<Void>() { @Override public void call(Void aVoid) { Observable.interval(1,TimeUnit.SECONDS,AndroidSchedulers.mainThread()) .take(10) .subscribe(new Observer<Long>() { @Override public void onCompleted() { RxTextView.text(button).call("获取验证码"); RxView.enabled(button).call(true); } @Override public void onError(Throwable e) { } @Override public void onNext(Long aLong) { RxTextView.text(button).call("剩余" + (10 - aLong) + "秒"); } }); } });
9)表单的验证,只有当用户名,密码输入格式正确了,才可以去点击登录按钮
/** *表单的验证,只有当用户名,密码输入格式正确了,才可以去点击登录按钮。 */ Observable<CharSequence> ObservableName = RxTextView.textChanges(editText); Observable<CharSequence> ObservablePassword = RxTextView.textChanges(editText2); Observable.combineLatest(ObservableName, ObservablePassword, new Func2<CharSequence, CharSequence, Boolean>() { @Override public Boolean call(CharSequence phone, CharSequence password) { return isPhoneValid(phone.toString()) && isPasswordValid(password.toString()); } }).subscribe(new Action1<Boolean>() { @Override public void call(Boolean aBoolean) { RxView.enabled(button).call(aBoolean); } });