ArrayAdapter в Listview notifydatasetchanged () очень медленная перерисовка - PullRequest
5 голосов
/ 27 сентября 2010

У меня довольно простой список с 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 ]

1 голос
/ 12 декабря 2012

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

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

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

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

--- avg run-time: 4ms

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

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

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

0 голосов
/ 06 октября 2011

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

...