Работаем над приложением для Android, которое имеет форму с автозаполнением текста с настраиваемым адаптером, для которого у нас есть arrayylist из около 1000 записей. Но с данными 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();
}
}
};
В вашем методе publishResults вы вызываете метод Adapteradd для каждого результата. Каждый раз, когда вызывается метод добавления, список уведомляется о том, что он был изменен.
Это может вызвать медленное поведение, которое вы наблюдаете.
Вместо этого используйте метод AdapteraddAll. Уведомление об изменении набора данных должно вызываться для вас addAll, если вы не изменили поведение по умолчанию с setNotifyOnChange.
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
clear();
if (results != null && results.count > 0) {
addAll(results)
}
}
Вы также можете оптимизировать свой метод performFiltering для использования структуры данных три, но я не думаю, что вам это понадобится для 1000 элементов.
Спасибо, проверим и сообщу вам.