Reputation: 4364
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
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