您的位置:首页 > 编程语言 > Java开发

Rxjava editText 实现searchview的功能

2017-06-22 17:49 429 查看
最近学习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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息