2014-12-06 4 views
0

Мой пользовательский адаптер для AutoCompleteTextView всегда возвращает все элементы. results.count всегда правильный размер, поэтому мне интересно, ...Пользовательский адаптер AutoCompleteTextView возвращает все элементы

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(); 
       } 

      } 
     }; 

    } 
} 

ответ

1

Я думаю, что этот код является виновником:

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(); 
      } 

     } 

Чтобы получить желаемый результат ,

+0

Это вызовет 'IndexOutOfBoundsException', потому что элементы не содержат все начальные элементы. – Chris

+0

Нельзя, у вас есть this.items = элементы в вашем конструкторе –

+0

'items = (ArrayList ) results.values;' будет перезаписывать начальные элементы, поэтому мне нужны 'itemsAll'. – Chris

Смежные вопросы