Reputation: 1641
I am using a MultiAutoCompleteTextView
and setting my own custom adapter (BaseAdapter) on it. But every time I write something in MultiAutoCompleteTextView, the constraint in the performFiltering
method always gets null value for every character I write.
Here is my code for the 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();
}
}
}
}
Here is how I am setting the adapter to MultiAutoCompleteTextView:
MultiAutoCompleteTextView textView = (MultiAutoCompleteTextView) findViewById(R.id.auto);
ListItemAdapter adapter = new ListItemAdapter(items, this);
textView.setThreshold(1);
textView.setAdapter(adapter);
What am I doing wrong here?
Edit:
I changed my MultiAutoCompleteTextView
to AutoCompleteTextView
and now it is working, does anyone know how to make it work for MultiAutoCompleteTextView?
Upvotes: 4
Views: 2874
Reputation: 7070
You need to setTokenizer()
to your MultiAutoCompleteTextView
in order to get it work.
You can use -
textView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
Even you can set your own custom tokenizer if you have any special requirements else you can use CommaTokenizer
which appends comma(,) everytime you select any option from the dropdown.
Upvotes: 4