Aman Grover
Aman Grover

Reputation: 1641

MultiAutoCompleteTextView with custom adapter (BaseAdapter)

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

Answers (1)

Shadab Ansari
Shadab Ansari

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

Related Questions