【发布时间】:2016-03-04 10:04:28
【问题描述】:
在这里:我正在输入“di”,但 AutoCompleteTextView 显示的是不相关的内容。
我是这样初始化的:
autocompleteAdapter = new AutoCompleteDropdownAdapter(MainActivity.activity,
android.R.layout.simple_list_item_1, autoCompleteStrings);
etSearch.setAdapter(autocompleteAdapter);
这是我的适配器(我尝试了标准的 ArrayAdapter,但结果相同)
class AutoCompleteDropdownAdapter extends ArrayAdapter<String> implements Filterable {
Activity main;
int rowLayout;
List<String> strings;
private ArrayList<String> originalValues;
private ArrayFilter filter;
public AutoCompleteDropdownAdapter(Activity main, int rowLayout, List<String> strings) {
super(main, rowLayout, strings);
this.main = main;
this.rowLayout = rowLayout;
this.strings = strings;
originalValues = new ArrayList<String>(strings);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return super.getView(position, convertView, parent);
}
@Override
public Filter getFilter() {
if (filter == null) {
filter = new ArrayFilter();
}
return filter;
}
private class ArrayFilter extends Filter {
private Object lock;
@Override
protected FilterResults performFiltering(CharSequence prefix) {
FilterResults results = new FilterResults();
if (originalValues == null) {
synchronized (lock) {
originalValues = new ArrayList<String>(strings);
}
}
if (prefix == null || prefix.length() == 0) {
synchronized (lock) {
ArrayList<String> list = new ArrayList<String>(originalValues);
results.values = list;
results.count = list.size();
}
} else {
final String prefixString = prefix.toString().toLowerCase();
ArrayList<String> values = originalValues;
int count = values.size();
ArrayList<String> newValues = new ArrayList<String>(count);
for (int i = 0; i < count; i++) {
String item = values.get(i);
if (item.toLowerCase().contains(prefixString)) {
newValues.add(item);
}
}
results.values = newValues;
results.count = newValues.size();
}
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if(results.values!=null){
ArrayList<String> tempStrings = (ArrayList<String>) results.values;
strings.clear();
strings.addAll(tempStrings);
}else{
strings = new ArrayList<String>();
}
if (results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
}
现在,当我调试 publishResults 方法时,它准确显示了我需要的 2 个结果,但是,AutoCompleteTextView 下拉了错误列表
【问题讨论】:
-
您是否使用充气器并将文本设置为下拉项?如果您跳过某些内容,请添加适配器的所有代码
-
不,只是 super.getView()
标签: java android android-arrayadapter android-adapter autocompletetextview