Настройка фильтра адаптера ListView

Рейтинг: 0Ответов: 1Опубликовано: 23.03.2015

Помогите, пожалуйста, исправить ошибку в коде. Поиск работает, но при уменьшении строки поиска - не откатывает результаты поиска - оставляет все как есть (только результаты последнего поиска). То есть если ввести в итоге поисковый запрос и получить при этом пустой список, то при удалении поискового запроса, список так же остается пустым...

Такое ощущение, что отфильтрованный список перезаписывает исходный...

private List<Zakazchik> listZakazchik = new ArrayList<>(); // фильтрую его

@Override
    public Filter getFilter() {
        Filter filter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults result = new FilterResults();
                List<Zakazchik> allZakazchik = listZakazchik;
                if(constraint == null || constraint.length() == 0){

                    result.values = allZakazchik;
                    result.count = allZakazchik.size();
                }else{
                    List<Zakazchik> filteredList = new ArrayList<Zakazchik>();
                    for(Zakazchik j: allZakazchik){
                        if(j.getName().toLowerCase().contains(constraint))
                            filteredList.add(j);
                        else if (j.getSubcategory().toLowerCase().contains(constraint))
                            filteredList.add(j);
                    }
                    result.values = filteredList;
                    result.count = filteredList.size();
                }

                return result;
            }

            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {

                if (results.count == 0) {
                    notifyDataSetInvalidated();
                } else {

                    listZakazchik = (ArrayList<Zakazchik>) results.values;
                    notifyDataSetChanged();
                }

            }

        };

        return filter;
    }

Ответы

▲ 2

Так и есть, перезаписывается. Как сделать, чтобы не перезаписывался?
Заменить

List<Zakazchik> allZakazchik = listZakazchik;

на

List<Zakazchik> allZakazchik = new ArrayList(listZakazchik);

Это создаст копию объекта listZakazchik, содержащую все ее элементы.

List<Zakazchik> allZakazchik = listZakazchik;

А это просто создаст еще одну ссылку на один и тот же объект.