Android EditText實現(xiàn)搜索框?qū)崟r處理,優(yōu)化數(shù)據(jù)請求

使用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);
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容