CustomArrayAdapter не обновляется после удаления текста фильтра

Привет, ребята, я реализовал свой собственный ArrayAdapter, потому что у меня есть два текстовых представления в одном элементе ListView. Хотя фильтрация работает нормально (она показывает правильные элементы), когда я удаляю текст, который я набрал для фильтрации элементов, ListView не переходит в исходное состояние (он не отображает все элементы), а просто оставляет отфильтрованный список без изменений. Вот моя реализация фильтра:

private class NightFilter extends Filter {

    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        items = (ArrayList<NightOut>) results.values;
        clear();
        int count = items.size();
        for (int i = 0; i < count; i++) {
            NightOut pkmn = (NightOut) items.get(i);
            add(pkmn);
        }
    }

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        FilterResults result = new FilterResults();
        if (constraint == null || constraint.length() == 0) {
            ArrayList<NightOut> list = new ArrayList<NightOut>(nightsOut);
            result.values = list;
            result.count = list.size();
        } else {
            final ArrayList<NightOut> list = new ArrayList<NightOut>(nightsOut);
            final ArrayList<NightOut> nlist = new ArrayList<NightOut>();
            int count = list.size();

            for (int i = 0; i < count; i++) {
                final NightOut nightOut = list.get(i);
                final String value = nightOut.getAddress().toLowerCase();

                if (value.contains(constraint.toString().toLowerCase())) {
                    nlist.add(nightOut);
                }
            }
            result.values = nlist;
            result.count = nlist.size();
        }
        return result;

    }
}

И nightOut, и items содержат объекты, которые я хочу фильтровать (я назначаю их в конструкторе). Мой собственный класс адаптера расширяет ArrayAdapter, если это может помочь.

Редактировать:

Добавлен код для конструктора и фильтрации текста

    public CustomArrayAdapter(Activity context, ArrayList<NightOut> nightsOut) {
    super(context, R.layout.list_item, nightsOut);
    this.context = context;
    this.nightsOut = nightsOut;
    this.items = nightsOut;
}

Метод поиска

        inputSearch.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
            ViewPlacesActivity.this.adapter.getFilter().filter(cs);
        }

Есть идеи, что мне не хватает?

Ура Кайл


person John Smith    schedule 30.03.2016    source источник
comment
где код вашего метода поиска?   -  person SacreDeveloper    schedule 30.03.2016
comment
Что ты имеешь в виду? Я выполняю фильтрацию в методе performFiltering. Поиск довольно прост. Я добавил слушателя в метод edittext и ontextchanged. Я выполняю фильтр, например: Activity.this.adapter.getFilter.filter (cs)   -  person John Smith    schedule 30.03.2016
comment
Текст запроса, введенный при просмотре search / editText.   -  person SacreDeveloper    schedule 30.03.2016
comment
Как я уже сказал, ontextchanged я вызываю что-то вроде Activity.this.adapter.getFilter.filter (cs), cs - это введенная последовательность символов   -  person John Smith    schedule 30.03.2016
comment
не говори, покажи это. может ты там что-то не так делаешь ..   -  person SacreDeveloper    schedule 30.03.2016
comment
Можете ли вы показать код своему пользовательскому конструктору ArrayAdapter, в котором вы назначаете items, nightsOut и вызываете суперконструктор?   -  person George Mulligan    schedule 30.03.2016
comment
Конечно, @GeorgeMulligan ee измененный вопрос   -  person John Smith    schedule 30.03.2016


Ответы (1)


То, как вы используете nightsOut в качестве списка источников для вашего ArrayAdapter, а также список источников для фильтра, является причиной проблемы.

В методе publishResults() у вас есть вызов clear(), который удаляет все элементы из списка nightsOut внутри ArrayAdapter, поскольку это список, на который он ссылается. Затем вы читали только отфильтрованные данные.

Затем при следующем вызове performFiltering() вы снова используете nightsOut в качестве исходного списка, который включает только отфильтрованные элементы.

Вместо этого вы хотите сделать ссылку на свои оригинальные предметы. Вам действительно не нужен items способ, которым он сейчас используется, поэтому я бы переименовал его в originalItems и сделал следующее:

public CustomArrayAdapter(Activity context, ArrayList<NightOut> nightsOut) {
    super(context, R.layout.list_item, nightsOut);
    this.context = context;
    this.nightsOut = nightsOut;
    originalItems = new ArrayList<>(nightsOut); // create a copy of nightsOut.
}

А потом фильтр

private class NightFilter extends Filter {

    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        ArrayList<NightOut> tempList = (ArrayList<NightOut>) results.values;
        clear();
        addAll(tempList);
    }

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        FilterResults result = new FilterResults();
        if (constraint == null || constraint.length() == 0) {
            result.values = originalItems;
            result.count = originalItems.size();
        } else {
            final ArrayList<NightOut> nlist = new ArrayList<NightOut>();
            String lowerConstraint = constraint.toString().toLowerCase();

            // loop through originalItems which always contains all items
            for(NightOut nightOut : originalItems) {
                final String value = nightOut.getAddress().toLowerCase();
                if (value.contains(lowerConstraint)) {
                    nlist.add(nightOut);
                }
            }

            result.values = nlist;
            result.count = nlist.size();
        }

        return result;
    }
}
person George Mulligan    schedule 30.03.2016
comment
Спасибо чувак! Я бы позволил тебе жениться на моей дочери, если бы она была у меня - person John Smith; 30.03.2016