Chris
Chris

Reputation: 4364

AutoCompleteTextView custom adapter returns all items

My custom adapter for a AutoCompleteTextView always returns all items. results.count is always the correct size, that's why I'm wondering...

public class UniversityAdapter extends ArrayAdapter<University> implements Filterable {
    List<University> items = new ArrayList<University>();
    List<University> itemsAll = new ArrayList<University>();
    private Context context;
    int resource;

    public UniversityAdapter(Context context, int resId, List<University> items) {
        super(context, resId, items);
        this.context = context;
        this.resource = resId;
        this.items = items;
        itemsAll.addAll(this.items);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row;

        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(resource, parent, false);
        } else {
            row = convertView;
        }

        University university = itemsAll.get(position);
        TextView nameView = (TextView) row.findViewById(android.R.id.text1);
        nameView.setText(university.getName());

        return row;
    }

    @Override
    public Filter getFilter() {
        return new Filter() {
            public String convertResultToString(Object resultValue) {
                String str = ((University) (resultValue)).getName();
                return str;
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                if (constraint != null) {
                    List<University> suggestions = new ArrayList<University>();
                    for (University university : itemsAll) {
                        if (university.getName().toLowerCase().startsWith(constraint.toString().toLowerCase())) {
                            suggestions.add(university);
                        }
                    }
                    FilterResults filterResults = new FilterResults();
                    filterResults.values = suggestions;
                    filterResults.count = suggestions.size();
                    return filterResults;
                } else {
                    return new FilterResults();
                }
            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                if (results.count > 0) {
                    items = (ArrayList<University>) results.values;
                    notifyDataSetChanged();
                } else {
                    notifyDataSetInvalidated();
                }

            }
        };

    }
}

Upvotes: 0

Views: 172

Answers (1)

Blaze Tama
Blaze Tama

Reputation: 10948

I think this code is the culprit :

this.items = items;
itemsAll.addAll(this.items); //remove this, use only items

I suggest to remove itemsAll completely because items is enough.

Look at this code :

items = (ArrayList<University>) results.values;
notifyDataSetChanged();

You use items not itemsAll

UPDATE

And change (see my comments) :

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            if (results.count > 0) {
                List<University> universities= (ArrayList<University>) results.values;
                items.clear(); //clear the old data
                for(University univ : universities)
                {
                   items.add(univ); //add each result
                }
                notifyDataSetChanged();
            } else {
                notifyDataSetInvalidated();
            }

        }

To get the desired result.

Upvotes: 1

Related Questions