使用EditText實現(xiàn)搜索框,優(yōu)化數(shù)據(jù)請求 ,實現(xiàn)實時搜索展示

search.png
當(dāng)EditText內(nèi)容發(fā)生改變時等待500毫秒,Message攜帶當(dāng)前EditText的內(nèi)容數(shù)據(jù)通知Hadnler去進(jìn)行處理,通過判斷攜帶數(shù)據(jù)和EditText此時的內(nèi)容數(shù)據(jù)是否相同決定是否進(jìn)行數(shù)據(jù)請求。減少多余的請求,提高效率。
關(guān)鍵代碼
private static final int MSG_SEARCH = 1;
/**
* 定義時傳入持有的Activity實例(弱引用)
*/
private Handler mHandler = new SearchHandler(this);
mBinding.searchView.etSearch.addTextChangedListener(new SearchTextWatcher());
private class SearchTextWatcher implements 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) {
String str = s.toString();
//文字變動 , 有未發(fā)出的搜索請求,應(yīng)取消
if (mHandler.hasMessages(MSG_SEARCH)) {
mHandler.removeMessages(MSG_SEARCH);
}
if (!TextUtils.isEmpty(str)) {
//否則延遲500ms開始搜索
Message msg = Message.obtain();
msg.what = MSG_SEARCH;
//攜帶當(dāng)前值
msg.obj = s.toString();
mHandler.sendMessageDelayed(msg, 500);
}
}
}
/**
* 自定義Handler子類
* 設(shè)置為:靜態(tài)內(nèi)部類
*/
private static class SearchHandler extends Handler {
// 定義 弱引用實例
private WeakReference<SeriesSearchActivity> reference;
// 在構(gòu)造方法中傳入需持有的Activity實例
public SearchHandler(SeriesSearchActivity activity) {
// 使用WeakReference弱引用持有Activity實例
reference = new WeakReference<SeriesSearchActivity>(activity);
}
// 通過復(fù)寫handlerMessage() 從而確定更新UI的操作
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == MSG_SEARCH) {
SeriesSearchActivity activity = reference.get();
String searchText = activity.mBinding.searchView.etSearch.getText().toString();
if (msg.obj.toString().equals(searchText)) {
//查詢搜索內(nèi)容
activity.queryObjectiveCampaignByName(searchText);
}
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// 外部類Activity生命周期結(jié)束時,同時清空消息隊列 & 結(jié)束Handler生命周期
mHandler.removeCallbacksAndMessages(null);
}