Rxjava editText 实现searchview的功能

最近学习Rxjava 自己实现一个searchView 的功能
1,限定用户操作时间,如一秒后才对数据的查询,避免无效的代码执行
2,利用Rxjava增加对数据的过滤操作,使用到的操作符debounce,filter….

为便于理解,本文从代码的执逻辑顺序写起

     //初始化函数
     EditText searchView;
     subject = PublishSubject.create();
//对subject的一些初始,实行目的限定用户操作时间,如一秒后才对数据的查询,避免无效的代码执行,采用 PublishSubject.create()的函数即可作为订阅者也可作为被订阅者,
操作函数:debounce,500毫秒内采取最后一次的操作

     subject.debounce(500,      TimeUnit.MILLISECONDS).observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber() {

                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable arg0) {

                    }

                    @Override
                    public void onNext(CharSequence charSequence) {
                        Log.d(TAG, "onNext" + charSequence.toString());
                        showSearchResult(charSequence);
                    }
                });



    //增加监听
searchView.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                // Log.d(TAG,
                // "s.toString()"+s.toString()+",s.toString().trim().length()"+s.toString().trim().length());
                if (s.toString().trim().length() > 0) {
                //执行查询的逻辑
                    subject.onNext(s);
                } 

            }
        });

查询的函数

/**
     * 显示查询的结果
     * 
     * @param s
     *            搜索框中输入的字符
     */
    private void showSearchResult(CharSequence s) {
        if (s.toString().trim().length() == 0) {
            return;
        }
    //过滤list的函数
        List list = getPhoneListfilter(s);
        Log.d(TAG, "addtextwatcher list" + list.size());
        if (list != null && list.size() > 0) {
        //显示listview
        } else {
            //显示数据为空时的界面
        }

    }

过滤list的函数
使用操作符filter 过滤操作

/**
     * 根据搜索框的数据过滤号码和人名查询SessionBean
     * 
     * @param s
     * @return
     */
    protected List getPhoneListfilter(final CharSequence s) {

        Log.d(TAG, "getPhoneListfilter");
        final List phoneList = new ArrayList();
        Observable.from(imSessionlist).filter(new Func1() {

            @Override
            public Boolean call(Bean bean) {
                return (bean.getPhoneName() != null && bean.getPhoneName().contains(s.toString()))
                        || (bean.getPhoneNumber() != null && bean.getPhoneNumber().contains(s.toString()));
            }
        }).subscribe(new Action1() {

            @Override
            public void call(SessionBean bean) {
                String phoneNum = bean.getPhoneNumber();
                String phoneName = bean.getPhoneName();
                int count = bean.getMessageCount();
                SessionBean newBean = new SessionBean();
                newBean.setPhoneName(phoneName);
                newBean.setPhoneNumber(phoneNum);
                newBean.setFileType(SessionBean.FILE_TYPE_TEXT_STRING);
                newBean.setMessageContent(count + "条信息 ");
                phoneList.add(newBean);

            }
        });
        return phoneList;

    }

你可能感兴趣的:(工作总结)