Android 开发 RX系列 之 RxBinding

前言:RxBinding 是 Jake Wharton 的一个开源库,它提供了一套在 Android 平台上的基于 RxJava的 Binding API。所谓 Binding,就是类似设置 OnClickListener 、设置 TextWatcher 这样的注册绑定对象的 API。


使用方法 

Button 防抖处理

 button = (Button) findViewById( R.id.bt ) ;

     RxView.clicks( button )
             .throttleFirst( 2 , TimeUnit.SECONDS )   //两秒钟之内只取一个点击事件,防抖操作
             .subscribe(new Action1<Void>() {
                 @Override
                 public void call(Void aVoid) {
                     Toast.makeText(MainActivity.this, "点击了", Toast.LENGTH_SHORT).show();
                 }
             }) ;
 
 
  • 按钮的长按时间监听

     button = (Button) findViewById( R.id.bt ) ;
    
     //监听长按时间
     RxView.longClicks( button)
          .subscribe(new Action1<Void>() {
              @Override
             public void call(Void aVoid) {
             Toast.makeText(MainActivity.this, "long click  !!", Toast.LENGTH_SHORT).show();
             }
         }) ;
    
  • listView 的点击事件、长按事件处理

    listView = (ListView) findViewById( R.id.listview );
    
     List<String> list = new ArrayList<>() ;
         for ( int i = 0 ; i < 40 ; i++ ){
             list.add( "sss" + i ) ;
         }
    
     final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1 );
         adapter.addAll( list );
    
     listView.setAdapter( adapter );
    
     //item click event
     RxAdapterView.itemClicks( listView )
         .subscribe(new Action1<Integer>() {
             @Override
             public void call(Integer integer) {
             Toast.makeText(ListActivity.this, "item click " + integer , Toast.LENGTH_SHORT).show();
                 }
             }) ;
    
     //item long click
     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();
                 }
             }) ;
    
- 用户登录界面,勾选同意隐私协议,登录按钮就变高亮
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 );
            }
        }) ;

搜索的时候,关键词联想功能 。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) {
                     //get the keyword
                     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();
                 }
             }) ;
public class RxUtil {

    /**
     * Avoid click too fast in 2 seconds there should
     * only shoot one click event
     *
     * @param view      view clicked
     * @param listener  view click listener
     * @param threshold click threshold, default 2000 millisecond, you should pass in second
     */
    public static void setClickListener(final View view, final View.OnClickListener listener, float... threshold) {
        RxView.clicks(view)
                .throttleFirst(threshold == null || threshold.length <= 0 ? 1000 :
                        (int)(threshold[0] * 1000F), TimeUnit.MILLISECONDS)
                .subscribe(new Action1<Void>() {
                    @Override
                    public void call(Void aVoid) {
                        listener.onClick(view);
                    }
                });
    }


}


总结

  • RxBinding就是把 发布--订阅 的模式用在了android控件的点击,文本变化上。通过 RxBinding 把点击监听转换成 Observable 之后,就有了对它进行扩展的可能。

  • RxBindingrxlifecycle 结合起来使用,可以控制控件监听的生命周期。关于rxlifecycle的使用



文章 是复制 http://www.cnblogs.com/zhaoyanjun/p/5535651.html 前辈的 一直在用也没总结 看了这篇写的不错 就转载了

项目地址是 https://github.com/JakeWharton/RxBinding



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值