chip.gif
類似知乎搜索這樣的畔乙,當(dāng)此次輸入超過設(shè)定的間隔時(shí)間就自動(dòng)搜索。
有兩種簡單的實(shí)現(xiàn)方法供大家參考一下:
- Handler
- RxJava
Handler
監(jiān)聽EditText
的輸入握恳,每當(dāng)文本變化紊选,先檢查Handler當(dāng)前有無未處理的消息,有則移除該消息卸勺,然后用sendEmptyMessageDelayed
再發(fā)送一條延遲消息,如若文本超過延遲時(shí)間沒有變化箩绍,該延遲消息就可以成功執(zhí)行
private final int RC_SEARCH = 1;
private final int INTERVAL = 300; //輸入時(shí)間間隔為300毫秒
private EditText mEtHandler;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == RC_SEARCH) {
handlerSearch();
}
}
};
mEtHandler.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (mHandler.hasMessages(RC_SEARCH)) {
mHandler.removeMessages(RC_SEARCH);
}
mHandler.sendEmptyMessageDelayed(RC_SEARCH, INTERVAL);
}
});
RxJava
學(xué)了RxJava后發(fā)現(xiàn)還有更簡便的方法孔庭,即使用debounce
操作符處理不斷產(chǎn)生的文本變化事件
debounce操作符對(duì)源Observable每產(chǎn)生一個(gè)結(jié)果后,如果在規(guī)定的間隔時(shí)間內(nèi)沒有別的結(jié)果產(chǎn)生材蛛,則把這個(gè)結(jié)果提交給訂閱者處理,否則忽略該結(jié)果怎抛。
private EditText mEtRxJava;
private final int INTERVAL = 300; //輸入時(shí)間間隔為300毫秒
RxTextView.textChangeEvents(mEtRxJava)
.debounce(INTERVAL, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<TextViewTextChangeEvent>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(TextViewTextChangeEvent textViewTextChangeEvent) {
rxJavaSearch();
}
});
p.gif
參考資料:
http://blog.csdn.net/theone10211024/article/details/50435325
http://blog.csdn.net/Job_Hesc/article/details/46495281