AutoCompleteTextView要实现模糊查询 ,重写ArrayAdapter和 系统里面自带的一样的代码,源代码是 匹配开头,设置 android:completionThreshold"=1 就是 第一个字符提示,默认是2个,将valueText.startsWith(prefixString)改为valueText.contains(prefixString)就能实现模糊查询。另外 AutoCompleteTextView属性列举一下:
setCompletionHint(CharSequence) | 设置下拉菜单中的提示标题 | |
android:completionHintView | 设置下拉菜单中提示标题的视图 | |
android:completionThreshold | setThreshold(int) | 设置用户至少输入几个字符才会显示提示 |
adnroid:dropDownAnchor | setDropDownAnchor(int) | 设置下拉菜单的定位“锚点”组件,如果没有指定该属性,将使用该TextView本身作为定位”锚点“组件 |
adnroid:dropDownHeight | setDropDownHeight(int) | 设置下拉菜单的高度 |
android:dropDownHorizontalOffest | 设置下拉菜单与文本框之间的水平偏移,下拉菜单默认与文本框左对齐 | |
adnroid:dropDownVerticalOffest | 设置下拉菜单与文本框之间的垂直偏移,下拉菜单默认紧跟文本框 | |
android:dropDownWidth | setDropDownWidth(int) | 设置下拉菜单的宽度 |
android:popupBackground | setDropDownBackgroundResource(int) | 设置下拉菜单的背景 |
@Override
public Filter getFilter() {
if (mFilter == null) {
mFilter = new ArrayFilter();
}
return mFilter;
}
//建立 过滤器
private class ArrayFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence prefix) {
// 过滤后利用FilterResults将过滤结果返回
FilterResults results = new FilterResults();
if (mUnfilteredData == null) {
mUnfilteredData = new ArrayList<String>(names);
}
if (prefix == null || prefix.length() == 0) {
ArrayList<String> list = mUnfilteredData;
results.values = list; // list是上面的过滤结果
results.count = list.size();// 结果数量
} else {
String prefixString = prefix.toString().toLowerCase();
ArrayList<String> unfilteredValues = mUnfilteredData;
int count = unfilteredValues.size();
ArrayList<String> newValues = new ArrayList<String>(count);
for (int i = 0; i < count; i++) {
String value = mUnfilteredData.get(i);
String valueText = value.toLowerCase();
if (valueText.contains(prefixString)) { //实现模糊查询
// valueText.contains(prefixString) 源码 ,匹配开头
newValues.add(value);
}
results.values = newValues;
results.count = newValues.size();
}
}
return results;
}
// 用于更新自动完成列表
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
names = (List<String>) results.values;
if (results.count > 0 && results != null) {
notifyDataSetChanged();
} else {// 无过滤结果,关闭列表
notifyDataSetInvalidated();
}
}
}