Есть ли разница между «ListView.invalidateViews ()» и «Adapter.notifyDataSetChanged ()»?

18

Есть ли разница между ListView.invalidateViews() и Adapter.notifyDataSetChanged() ?     

задан Gaurav Agarwal 20.05.2012 в 21:58
источник

1 ответ

39

Ну да, есть.

ListView.invalidateViews() используется, чтобы сообщить ListView о недействительности всех его дочерних элементов (перерисовать их). Обратите внимание, что нет необходимости иметь равное количество просмотров, чем элементы. Это потому, что ListView перерабатывает свои представления элементов и перемещает их по экрану разумным способом во время прокрутки.

Adapter.notifyDataSetChanged() , с другой стороны, заключается в том, чтобы сказать наблюдателю адаптера, что содержимое того, что адаптируется, изменилось. Уведомление об изменении набора данных приведет к тому, что listview снова вызовет ваши методы адаптеров, чтобы настроить полосы прокрутки, регенерировать представления элементов и т. Д.

В большинстве случаев вы хотите использовать notifyDataSetChanged вместо invalidateViews , но это, безусловно, зависит от того, что вы пытаетесь выполнить.

    
ответ дан K-ballo 20.05.2012 в 22:01
источник
  • Я немного смущен, когда вы говорите. Обратите внимание, что не должно быть равного количества просмотров, чем элементов. В чем разница между видами и элементами. –  Gaurav Agarwal 20.05.2012 в 22:11
  • @black crow: список не создает представление для каждого элемента. Вместо этого он обычно имеет только количество просмотров, которые будут вписываться в экран плюс один, и перемещает их по мере прокрутки. Простыми словами: он не создает представления для элементов, которые не видны. –  K-ballo 20.05.2012 в 22:12
  • У вас есть место для 10 просмотров на экране, и у вас есть 20 в вашем адаптере ... так что у вас есть 10 просмотров и 20 предметов. –  Barak 20.05.2012 в 22:14
  • @black crow: Это трудный пример для поиска. Если вы все сделаете правильно, то invalidateViews будут полезны только в том случае, если вам нужно перерисовать видимые элементы, но ничего из них не изменилось ... –  K-ballo 20.05.2012 в 22:24
  • @GauravAgarwal: хорошим использованием invalidateViews будет изменение размера шрифта вашего ListView: вы не касаетесь данных, а рендеринга. –  Luis A. Florit 19.10.2013 в 16:39
Показать остальные комментарии