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