基于 RxJava 的组件异步调用
一、基础
0.添加依赖
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'
compile 'com.jakewharton.rxbinding:rxbinding-recyclerview-v7:0.4.0'
1.使用案例
// View 点击监听
RxView.clicks(btnClick)
// 两秒钟之内只取一个点击事件,防抖操作
.throttleFirst(2, TimeUnit.SECONDS)
.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
Log.i("RxBinding","(Button) 触发【点击】事件!");
}
});
二、常用事件
1.View.setOnClickListener()
: View 点击监听
// View 点击监听
RxView.clicks(btnClick)
// 两秒钟之内只取一个点击事件,防抖操作
.throttleFirst(2, TimeUnit.SECONDS)
.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
Log.i("RxBinding","(Button) 触发【点击】事件!");
}
});
2.View.setOnLongClickListener()
: View 长按监听
// View 长按监听
RxView.longClicks(btnClick)
.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
Log.i("RxBinding","(Button) 触发【长按】事件!");
}
});
3.CheckBox.setOnCheckedChangeListener()
: CheckBox 选择状态改变监听
// CheckBox 监听事件
RxCompoundButton.checkedChanges(cbAgreement)
.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean aBoolean) {
// 设置登录按钮是否可点击
btnClick.setEnabled(aBoolean);
// 设置登录按钮背景色
btnClick.setBackgroundResource(aBoolean ? R.color.button_yes : R.color.button_no);
}
});
4.ListView.setOnItemClickListener()
: ListView 子项点击事件
// ListView Item 点击事件
RxAdapterView.itemClicks(lvClick)
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.i("RxBinding", "(ListView) 【 点击 : " + integer + " 项 】");
}
});
5.ListView.setOnItemLongClickListener()
: ListView 子项长按事件
// ListView Item 长按事件
RxAdapterView.itemLongClicks(lvClick)
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.i("RxBinding", "(ListView) 【 长按 : " + integer + " 项 】");
}
});
6.EdiText.addTextChangedListener()
: EdiText 改变事件
// EdiText 改变事件
RxTextView.textChanges(etSearch)
// 在一次事件发生后的一段(600毫秒)时间内没有新操作,则发出这次事件
.debounce(600, TimeUnit.MILLISECONDS)
.map(new Func1<CharSequence, String>() {
@Override
public String call(CharSequence charSequence) {
// CharSequence 转换为 String
return charSequence.toString();
}
})
// 接下来的事件执行线程为IO
.observeOn(Schedulers.io())
.map(new Func1<String, List<String>>() {
@Override
public List<String> call(String keyWord) {
// String 转换为 List<String>
List<String> dataList = new ArrayList<>();
if (!TextUtils.isEmpty(keyWord)) {
for (String s : listSearchData) {
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) {
searchAdapter.clear();
searchAdapter.addAll(strings);
searchAdapter.notifyDataSetChanged();
}
});
2017-1-5 15:36:59
网友评论