RxJava 从入门到实践(五:框架之RxBinding)

一. RxBinding的概念
RxBinding是基于RxJava的,用于绑定Android UI控件的框架;

它可以异步获取,并处理控件的各类事件(如:点击事件,文字变化,选中状态)

地址:

https://github.com/JakeWharton/RxBinding

二.RxBinding的配置

compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'
compile 'com.jakewharton.rxbinding:rxbinding-support-v4:0.4.0'
compile 'com.jakewharton.rxbinding:rxbinding-appcompat-v7:0.4.0'

compile 'com.jakewharton.rxbinding:rxbinding-design:0.4.0'

三.RxBinding的使用场景

防抖处理,选中状态联动,自动补完text

1>防抖处理

   clickSubscription = RxView.clicks(mButton).throttleFirst(600,TimeUnit.MILLISECONDS).subscribe(new Action1<Void>() {
            @Override
            public void call(Void aVoid) {
//              Snackbar.make(mButton,"发送了"+ ++i+"事件",Snackbar.LENGTH_SHORT).show();
                Log.d("TAG","发送了"+ ++i+"事件");
            }
        });
     //未做防抖处理
        clickSubscription = RxView.clicks(mButton).throttleFirst(600, TimeUnit.MILLISECONDS).subscribe(new Action1<Void>() {
            @Override
            public void call(Void aVoid) {
                Snackbar.make(mButton, "发送了" + ++i + "个事件", Snackbar.LENGTH_SHORT).show();
          }
       });

        //长按监听
        RxView.longClicks(mButton).subscribe(new Action1<Void>() {
            @Override
            public void call(Void aVoid) {
                Log.d("TAG","longClick");
            }
        });
        //item点击监听
        RxAdapterView.itemClicks(mListView).subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                Log.d("TAG","itemClick---"+integer);
            }
        });
        //item长按监听
        RxAdapterView.itemLongClicks(mListView).subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                Log.d("TAG","itemLongClick---"+integer);
            }
        });
   //初始化监听器
    private void initListener() {
        RxTextView.textChangeEvents(inputET).debounce(400, TimeUnit.MILLISECONDS)
                .subscribeOn(AndroidSchedulers.mainThread())
                .switchMap(new Func1<TextViewTextChangeEvent, Observable<List<String>>>() {
                    @Override
                    public Observable<List<String>> call(TextViewTextChangeEvent event) {

                        return getDataFromNet(event.text().toString().trim()).subscribeOn(Schedulers.io());
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<List<String>>() {
                    @Override
                    public void call(List<String> dataList) {
                        initadapter(dataList);
                    }
                });
    }


2.自动补全

 //初始化监听器
    private void initListener() {
        RxTextView.textChangeEvents(inputET).debounce(400, TimeUnit.MILLISECONDS)
                .subscribeOn(AndroidSchedulers.mainThread())
                .switchMap(new Func1<TextViewTextChangeEvent, Observable<List<String>>>() {
                    @Override
                    public Observable<List<String>> call(TextViewTextChangeEvent event) {

                        return getDataFromNet(event.text().toString().trim()).subscribeOn(Schedulers.io());
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<List<String>>() {
                    @Override
                    public void call(List<String> dataList) {
                        initadapter(dataList);
                    }
                });
    }

    private Observable<List<String>> getDataFromNet(String changeText) {

        return Observable.create(new Observable.OnSubscribe<List<String>>() {
            @Override
            public void call(Subscriber<? super List<String>> subscriber) {
                //模拟从网络获取数据
                SystemClock.sleep(1000);
                List<String> dataList = new ArrayList<>();
                if (!changeText.equals("")) {
                    for (int i = 0; i < 10; i++) {
                        dataList.add("auto_text:" + changeText + i);
                    }
                }
                subscriber.onNext(dataList);
                subscriber.onCompleted();
            }
        });
    }

    //设置适配器,更新数据
    private void initadapter(List<String> tempList) {
        if (adapter == null) {
            list = new ArrayList<>();
            adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, list);
            autoLV.setAdapter(adapter);
        }
        list.clear();
        list.addAll(tempList);
        adapter.notifyDataSetChanged();

    }

switch()和flatMap()很像,除了一点:当源Observable发射一个新的数据项时,如果旧数据项订阅还未完成,就取消旧订阅数据和停止监视那个数据项产生的Observable,开始监视新的数据项

3.选中状态联动

   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if (rootView == null) {
            rootView = inflater.inflate(R.layout.fragment_checkbox, container, false);
            signCB = (CheckBox) rootView.findViewById(R.id.sign_checkbox);
            signBtn = (Button) rootView.findViewById(R.id.sign_btn);
        }
        //初始化监听器
        initListener();
        return rootView;
    }

    private void initListener() {
        //选中事件监听
        RxCompoundButton.checkedChanges(signCB).subscribe(new Action1<Boolean>() {
            @Override
            public void call(Boolean aBoolean) {
                signBtn.setEnabled(aBoolean);
                signBtn.setBackgroundResource(aBoolean ? R.color.colorAccent : R.color.gray);
            }
        });
    }
栗子的源码链接:https://pan.baidu.com/s/1DOXLOQv23Ac7UCZfoxxPKQ 密码:4n56

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值