ArrayAdapter в Listview notifydatasetchanged() очень медленная перерисовка

У меня довольно простой список с 3 текстовыми полями в каждой строке. Мы обновляем их значения каждые 2 секунды или около того с данными, поступающими от фонового вызова веб-службы ( AsyncTask)

Мы сравниваем поступающие значения с текущими, обновляем их соответствующим образом на адаптере и, наконец, при необходимости вызываем notifyDataSetChanged()

Дело в том, что перерисовка становится очень медленной, что приводит к зависанию всего пользовательского интерфейса, когда мы получили более 3 строк обновления одновременно. Конечно, мы используем все известные оптимизации ListView, такие как подход EfficientAdapter ( setTag() и holders) и getViewTypecount()/getItemViewType() . Мы также постарались максимально оптимизировать наш интерфейс с помощью layoutopt и стараемся избегать ширины и высоты wrap_content, чтобы облегчить ситуацию.

Мы также не делаем дорогих операций с нашими обновлениями, а просто выполняем стандартные операции: меняем значения TextView, textcolor и backgroundcolor.

Единственная странная вещь, которую я вижу, это то, что getView() вызывается 3-4-5 раз для каждой строки, хотя я прочитал все эти сообщения Ромена [1], говорящие, что в этом нет ничего плохого

Любые идеи или советы о том, как мы можем ускорить это?

Большое спасибо!

[1] http://groups.google.com/group/android-developers/browse_thread/thread/4c4aedde22fe4594/aeb04288064f495e?show_docid=aeb04288064f495e

2 ответа

Это для тех, кто просматривает Google, думая, что им нужно переписать свой метод изменения данных. На основании моих данных, вам не нужно во многих случаях.

notifyDataSetChanged() может быть НАМНОГО БЫСТРЕЕ, чем ваша ручная замена, и все зависит от вашего фактического listview реализация.

Пример: простой трехстрочный вид списка только с 10K строкой ArrayList обновляется через выбор меню.

Руководство notifyDataSetChange()

--- avg run-time: 4ms

По умолчанию бесплатно notifyDataSetChange()

--- avg run-time: 0ms <--- you can't get faster than this.

Не бегите, чтобы создать свою собственную замену, если вы не оцените время и не сравните результаты. Используйте бесплатные вещи, пока не понадобится.

Я полагаю, вы можете установить тег для url textView в качестве URL-адреса, откуда он будет получать обновление. И вместо того, чтобы вызывать "notifyDataSetChanged()", вы можете попробовать использовать findViewByTag(update URL) и setText для этого представления, так что текстовое представление перекрашивается только не весь список снова и снова. Достаточно бы уменьшить количество дополнительных перекрасок. Просто мысль.

Другие вопросы по тегам