Rxjava editText 实现searchview的功能

来源:互联网 发布:稳定的排序算法 编辑:程序博客网 时间:2024/06/06 02:19

最近学习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<CharSequence>() {                    @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<SessionBean> 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<SessionBean> getPhoneListfilter(final CharSequence s) {        Log.d(TAG, "getPhoneListfilter");        final List<SessionBean> phoneList = new ArrayList<Bean>();        Observable.from(imSessionlist).filter(new Func1<Bean, Boolean>() {            @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<SessionBean>() {            @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;    }
原创粉丝点击