带有自定义适配器 (BaseAdapter) 的 MultiAutoCompleteTextView
MultiAutoCompleteTextView with custom adapter (BaseAdapter)
我正在使用 MultiAutoCompleteTextView
并在其上设置我自己的自定义适配器 (BaseAdapter)。但是每次我在 MultiAutoCompleteTextView 中写东西时,performFiltering
方法中的约束总是为我写的每个字符获取空值。
这是我的 BaseAdapter 代码 class:
public class ListItemAdapter extends BaseAdapter implements Filterable{
ArrayList<ListItem> listItems;
ArrayList<ListItem> suggestions = new ArrayList<>();
private Filter filter = new CustomFilter();
Context context;
LayoutInflater inflater;
public ListItemAdapter(ArrayList<ListItem> listItems, Context context) {
this.listItems = listItems;
this.context = context;
inflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return listItems.size();
}
@Override
public Object getItem(int position) {
return listItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
v = inflater.inflate(R.layout.single_item, null);
TextView title = (TextView) v.findViewById(R.id.title);
title.setText(listItems.get(position).getTitle());
return v;
}
@Override
public Filter getFilter() {
return filter;
}
private class CustomFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
suggestions.clear();
Log.d("FILTERRES", ""+listItems.size() + ", " + constraint);
if(listItems != null && constraint != null) {
for(int i=0 ; i<listItems.size(); i++) {
if(listItems.get(i).getTitle().toLowerCase().contains(constraint)) {
suggestions.add(listItems.get(i));
}
}
}
FilterResults results = new FilterResults();
results.values = suggestions;
results.count = suggestions.size();
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if(results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
}
}
下面是我如何将适配器设置为 MultiAutoCompleteTextView:
MultiAutoCompleteTextView textView = (MultiAutoCompleteTextView) findViewById(R.id.auto);
ListItemAdapter adapter = new ListItemAdapter(items, this);
textView.setThreshold(1);
textView.setAdapter(adapter);
我做错了什么?
编辑:
我将 MultiAutoCompleteTextView
更改为 AutoCompleteTextView
,现在它可以正常工作了,有人知道如何让它在 MultiAutoCompleteTextView 上工作吗?
您需要 setTokenizer()
到您的 MultiAutoCompleteTextView
才能正常工作。
你可以使用-
textView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
如果您有任何特殊要求,您甚至可以设置自己的自定义分词器,否则您可以使用 CommaTokenizer
,它会在您每次 select 下拉列表中的任何选项时附加逗号 (,)。
我正在使用 MultiAutoCompleteTextView
并在其上设置我自己的自定义适配器 (BaseAdapter)。但是每次我在 MultiAutoCompleteTextView 中写东西时,performFiltering
方法中的约束总是为我写的每个字符获取空值。
这是我的 BaseAdapter 代码 class:
public class ListItemAdapter extends BaseAdapter implements Filterable{
ArrayList<ListItem> listItems;
ArrayList<ListItem> suggestions = new ArrayList<>();
private Filter filter = new CustomFilter();
Context context;
LayoutInflater inflater;
public ListItemAdapter(ArrayList<ListItem> listItems, Context context) {
this.listItems = listItems;
this.context = context;
inflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return listItems.size();
}
@Override
public Object getItem(int position) {
return listItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
v = inflater.inflate(R.layout.single_item, null);
TextView title = (TextView) v.findViewById(R.id.title);
title.setText(listItems.get(position).getTitle());
return v;
}
@Override
public Filter getFilter() {
return filter;
}
private class CustomFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
suggestions.clear();
Log.d("FILTERRES", ""+listItems.size() + ", " + constraint);
if(listItems != null && constraint != null) {
for(int i=0 ; i<listItems.size(); i++) {
if(listItems.get(i).getTitle().toLowerCase().contains(constraint)) {
suggestions.add(listItems.get(i));
}
}
}
FilterResults results = new FilterResults();
results.values = suggestions;
results.count = suggestions.size();
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if(results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
}
}
下面是我如何将适配器设置为 MultiAutoCompleteTextView:
MultiAutoCompleteTextView textView = (MultiAutoCompleteTextView) findViewById(R.id.auto);
ListItemAdapter adapter = new ListItemAdapter(items, this);
textView.setThreshold(1);
textView.setAdapter(adapter);
我做错了什么?
编辑:
我将 MultiAutoCompleteTextView
更改为 AutoCompleteTextView
,现在它可以正常工作了,有人知道如何让它在 MultiAutoCompleteTextView 上工作吗?
您需要 setTokenizer()
到您的 MultiAutoCompleteTextView
才能正常工作。
你可以使用-
textView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
如果您有任何特殊要求,您甚至可以设置自己的自定义分词器,否则您可以使用 CommaTokenizer
,它会在您每次 select 下拉列表中的任何选项时附加逗号 (,)。