[英]AutoCompleteTextView custom adapter returns all items
我為AutoCompleteTextView
定制的適配器始終返回所有項目。 results.count
始終是正確的大小,這就是為什么我想知道...
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();
}
}
};
}
}
我認為這是罪魁禍首:
this.items = items;
itemsAll.addAll(this.items); //remove this, use only items
我建議完全刪除itemsAll
因為items
已足夠。
看這段代碼:
items = (ArrayList<University>) results.values;
notifyDataSetChanged();
您使用的items
不是itemsAll
UPDATE
並更改(請參閱我的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();
}
}
得到期望的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.