一. RxBinding的概念
RxBinding是基于RxJava的,用于绑定Android UI控件的框架;
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