Android 根據(jù)首字或字母進(jìn)行模糊搜索

Android 應(yīng)用中很多地方需要用到根據(jù)首字,或者拼音等進(jìn)行模糊搜索,如下圖,輸入拼音就會(huì)顯示模糊搜索的結(jié)果,一般需要模糊查詢的都是網(wǎng)絡(luò)數(shù)據(jù),很少是本地寫死的,


image.png

AutoCompleteTextView

這個(gè)Android 控件相信很多人都沒怎么用過,我也是要做這種查詢結(jié)果的時(shí)候,才發(fā)現(xiàn)有這個(gè)控件的(可能我太孤陋寡聞),哈哈哈。

AutoCompleteTextView 幾個(gè)常用屬性:
<AutoCompleteTextView 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:completionThreshold="1"                    //設(shè)置用戶至少輸入幾個(gè)字符才會(huì)顯示
            android:dropDownHeight="200dp"                     //設(shè)置下拉菜單的高度
            android:dropDownWidth="180dp"                      //設(shè)置下拉菜單的寬度
            android:gravity="center"
            android:textSize="15sp" />

我這里只用到上面三個(gè),其實(shí)還有很多個(gè)

android:popupBackground     //設(shè)置下拉菜單的背景
dropDownSelector            //設(shè)置選中的背景顏色
.......

這里就不全部寫出來了,有需要百度一下就有了

實(shí)例:

這里以查詢的結(jié)果是網(wǎng)絡(luò)請(qǐng)求的為例,因?yàn)槲疫@里是后臺(tái)已經(jīng)把根據(jù)拼音查找漢字的做好了,我就不用再轉(zhuǎn)換了,如果需要轉(zhuǎn)換的,找一下轉(zhuǎn)換的工具類就可以了。

        //監(jiān)聽輸入框的變化
        autoView.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) {
                cust_id_code = String.valueOf(s);
                cust_id_View.setText("");
                //監(jiān)聽輸入框,已輸入就去查詢
                if (cust_id_code != null) {
                    //判斷是否有網(wǎng)絡(luò)
                    if (!isNetworkAvailable(ScanOrderActivity.this)) {
                        UtilToast.showToast(ScanOrderActivity.this, "請(qǐng)檢查您的網(wǎng)絡(luò)");
                    } else {
                        iniData();
                    }
                }
            }
        });

在這里監(jiān)聽輸入框,當(dāng)有用戶輸入數(shù)據(jù)時(shí),先進(jìn)行網(wǎng)絡(luò)判斷,如果有網(wǎng)絡(luò)就進(jìn)行請(qǐng)求。
請(qǐng)求成功有數(shù)據(jù)后就可以給 AutoCompleteTextView 設(shè)置適配器了,適配器跟 Spinner 下拉框的適配器差不多

 searchAdapter = new ArrayAdapter<String>(ScanOrderActivity.this, android.R.layout.simple_list_item_1, array);
 autoView.setAdapter(searchAdapter);

網(wǎng)絡(luò)請(qǐng)求回來的數(shù)據(jù)通過解析,我這邊解析生成的是 List ,而適配器要的是 String [ ];所以要轉(zhuǎn)換一下,

String [] array = arrayList.toArray(new String[arrayList.size()])

注意:
記得在主線程 更新Ui,如果是Rxjava+Retrofit做的網(wǎng)絡(luò)請(qǐng)求,直接設(shè)置,和刷新就可了,如果是其他的需要切換到主線程,我這邊是用 Handler,如果不懂 Handler 可以參考我這一篇Handler 的解析 http://www.lxweimin.com/p/cb0364856349

   @Override
            public void onResponse(Call call, Response response) throws IOException {
                cust_name.clear();
                Gson gson = new Gson();
                scanSearchModel = gson.fromJson(response.body().string(), ScanSearchModel.class);
                for (int i = 0; i < scanSearchModel.getData().size(); i++) {
                   arrayList.add(scanSearchModel.getData().get(i).getCust_name());
                }
                //array轉(zhuǎn)String[]
                array =arrayList.toArray(new String[arrayList.size()]);
                Message message = new Message();
                message.what = UPDATA;
                handler.sendMessage(message);
            }

Hnadler

private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case UPDATA:
                    if (array != null) {
                        searchAdapter = new ArrayAdapter<String>(ScanOrderActivity.this, android.R.layout.simple_list_item_1, array);
                        autoView.setAdapter(searchAdapter);
                        searchAdapter.notifyDataSetChanged();
                    }
                    break;
                default:
                    break;
            }
        }
    };

還需要記得當(dāng)當(dāng)前Activity銷毀時(shí),移除Handler,或者把Handler聲明成 static +弱引用,然后使用否則會(huì)導(dǎo)致非靜態(tài)內(nèi)部類隱式持有外部類的引用的內(nèi)存泄漏,這里為了方便就用了移除

 @Override
    protected void onDestroy() {
        super.onDestroy();
        handler.removeMessages(UPDATA);
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,065評(píng)論 25 708
  • 第七天
    優(yōu)束129閱讀 199評(píng)論 0 0
  • 當(dāng)你想要做點(diǎn)什么的時(shí)候,總會(huì)有人跟你說,你不行,如果你想要證明些什么,就把他做出來,就這樣。------此為題記...
    習(xí)慣了幻想閱讀 2,325評(píng)論 0 2
  • 我以為雨水可以沖刷掉對(duì)你的思念 卻只是模糊了雙眼 我以為汗水可以讓我忘卻 卻只是讓我徹夜無眠 如果沒有徹底的疲倦 ...
    王不煩閱讀 241評(píng)論 0 1
  • 我現(xiàn)在也不知道是咋了,看到數(shù)字就煩,啥都煩,因?yàn)椴粷M意現(xiàn)在,所以總是抱怨和懊惱,停止,學(xué)會(huì)享受生活,今天的天很藍(lán),...
    栠傾閱讀 334評(píng)論 0 0