RxBinding介绍
RxBinding是JakeWharton的一个开源库 , 它提供了一套基于RxJava的BindingApI. 可以帮助我们简化控件/视图添加的触发的响应事件,而且使用起来非常简单
RxBinding在github上的地址
点击打开链接
集成RxBinding的准备工作
在build.gradle中引用以下文件
compile 'com.jakewharton.rxbinding:rxbinding:1.0.0'
compile 'com.jakewharton.rxbinding:rxbinding-support-v4:1.0.0'
compile 'com.jakewharton.rxbinding:rxbinding-appcompat-v7:1.0.0'
compile 'com.jakewharton.rxbinding:rxbinding-design:1.0.0'
RxBinding使用
1.按钮防抖事件处理
- but = (Button) findViewById( R.id.bt) ;
- RxView.clicks(but)
- //表示在2秒之内只取一个点击事件,防抖操作
- .throttleFirst(2, TimeUnit.SECONDS)
- .subscribe(new Action1<Void>() {
- @Override
- public void call(Void aVoid) {
- Toast.makeText(mContext, "点击了....", Toast.LENGTH_SHORT).show();
- }
- });
2.按钮长按监听
- but = (Button) findViewById( R.id.bt) ;
- RxView.longClicks(but).subscribe(new Action1<Void>() {
- @Override
- public void call(Void aVoid) {
- Toast.makeText(mContext, "long click...", Toast.LENGTH_SHORT).show();
- }
- });
3.复选框选择监听
- cb = (CheckBox) findViewById( R.id.checkbox );
- RxCompoundButton.checkedChanges(cb).subscribe(new Action1<Boolean>() {
- @Override
- public void call(Boolean aBoolean) {
- Toast.makeText(mContext, aBoolean? "被选中":"取消选择", Toast.LENGTH_SHORT).show();
- }
- });
4.Item点击事件 , 长按事件处理
- listView = (ListView) findViewById( R.id.listview );
- RxAdapterView.itemClicks( listView )
- .subscribe(new Action1<Integer>() {
- @Override
- public void call(Integer integer) {
- Toast.makeText(ListActivity.this, "item click " + integer , Toast.LENGTH_SHORT).show();
- }
- }) ;
- RxAdapterView.itemLongClicks( listView)
- .subscribe(new Action1<Integer>() {
- @Override
- public void call(Integer integer) {
- Toast.makeText(ListActivity.this, "item long click " + integer ,Toast.LENGTH_SHORT).show();
- }
- }) ;
5.搜索时候 , 关键词联想功能
- 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 ) {
- 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();
- }
- }) ;
6.获取验证码设置倒计时
- But3 = (Button) findViewById( R.id.bt3) ;
- mVerifyCodeObservable = RxView.clicks(but3)
- .throttleFirst(20, TimeUnit.SECONDS)
- .subscribeOn(AndroidSchedulers.mainThread())
- .doOnNext(new Action1<Void>() {
- @Override
- public void call(Void aVoid) {
- RxView.enabled(but3).call(false);
- }
- });
- mVerifyCodeObservable.subscribe(new Action1<Void>() {
- @Override
- public void call(Void aVoid) {
- Observable.interval(1,TimeUnit.SECONDS,AndroidSchedulers.mainThread())
- .take(20)
- .subscribe(new Observer<Long>() {
- @Override
- public void onCompleted() {
- RxTextView.text(but3).call("获取验证码");
- RxView.enabled(but3).call(true);
- }
- @Override
- public void onError(Throwable e) {
- }
- @Override
- public void onNext(Long aLong) {
- RxTextView.text(but3).call("剩余" + (20-aLong));
- }
- });
- }
- });
总结
- RxBinding把发布--订阅的模式用在了控件的点击和文本的变化上
- RxBinding几乎支持工作中常用的所有控件以及事件
- RxBinding引用库还有对应的kotlin支持库