AutocompleteTextView с 1000 записей в Arraylist не работает - PullRequest
0 голосов
/ 26 декабря 2018

Работа над приложением для Android, у которого есть форма с autocompletetextview с пользовательским адаптером, для которого у нас есть массив из около 1 тыс. Записей.Но с данными 1К это не работает.Приблизительно с 400 записями это работает, но фильтрация медленная.Что можно сделать для обработки такого большого набора данных?

Ниже приведен фрагмент кода для фильтрации:

     @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        if (constraint != null) {
            suggestions.clear();

            for (ToMeet toMeet : tempItems) {
                if (toMeet.getNm().toLowerCase().contains(constraint.toString().toLowerCase()) ||
                        (toMeet.getAptNo() != null && toMeet.getAptNo().toLowerCase().toLowerCase().
                                contains(constraint.toString().toLowerCase()))) {

                    suggestions.add(toMeet);
                }
            }
            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 != null && results.count > 0) {
            ArrayList<ToMeet> filteredList = (ArrayList<ToMeet>) ((ArrayList<ToMeet>) results.values).clone();
            clear();
            for (ToMeet toMeet : filteredList) {
                add(toMeet);

            }
            notifyDataSetChanged();
        }
    }
};

1 Ответ

0 голосов
/ 26 декабря 2018

В вашем методе publishResults вы вызываете метод Adapter add для каждого результата.Каждый раз, когда вызывается метод add, список уведомляется о том, что он был изменен.

Это может вызвать медленное поведение, которое вы видите.

Вместо этого используйте метод Adapter addAll,Уведомление об изменении набора данных должно вызываться для вас addAll, если вы не изменили поведение по умолчанию с помощью setNotifyOnChange

@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
    clear();
    if (results != null && results.count > 0) {
        addAll(results)
    }
}

Вы также можете оптимизировать свой метод performFiltering для использования trie структура данных, но я не думаю, что вам нужно для 1000 пунктов.

...