Android. Как работает метод notifyDataSetChanged () и ListViews?

Я пытаюсь понять концепцию ListView и как она работает, и я пытаюсь создать свой собственный адаптер, который расширяет BaseAdapter . Например, для ArrayAdapter существует метод notifyDataSetChanged() который следует вызывать после обновления списка массивов, который содержит все ваши данные, чтобы обновить ListView .

Но я создаю свой собственный подclass BaseAdapter . Этот метод недоступен мне или не так ли? Как реализовать этот метод? В принципе, что делает этот метод, возможно, я тогда пойму.

В случае ArrayAdapter я предполагаю, что он смотрит, в какой позиции ListView отображается в настоящее время, и проверяет, совпадает ли он с ArrayList после его обновления? Или…

В нем говорится, что метод:

Сообщает заинтересованным наблюдателям, что базовые данные были изменены, и любой вид, отражающий dataset, должен обновиться.

Но как именно он обновляется?

Может кто-нибудь объяснить, пожалуйста?

Я понял это . Я не мог понять, как, черт возьми, появился адаптер и как он узнал, откуда взять данные. Когда я расширил class BaseAdapter , в конструкторе этого classа я инициализировал список элементов, которые я хотел увидеть в ListView . Но я не мог понять, как эти ценности будут использоваться и когда.

Вот и все! :

В BaseAdapter есть некоторые методы, которые необходимо переопределить. Среди них есть getCount() .

Когда ListView создан и еще много чего, он вызывает getCount() . Если это возвращает значение, отличное от 0 (я вернул размер ArrayList, который я ранее инициализировал в конструкторе), он вызывает getView() достаточно времени, чтобы заполнить экран элементами. Например , я инициализировал ArrayList с 20 элементами. Поскольку на экране getView() всего 8 элементов, getView() вызывался 8 раз, каждый раз прося позицию, которую мне нужно было вернуть (точнее, он хотел знать, как строка будет выглядеть в списке на этой конкретной позиции , какие данные он должен содержать). Если я getView() список вниз, getView() будет вызываться снова и снова, «пока я не getView() в конец списка, в моем случае 20 элементов / строк.

Что notifyDataSetChanged() делает … когда он вызывается, он смотрит, какие элементы отображаются на экране в момент его вызова (точнее, какие индексы строк) и вызывает getView() с этими позициями.

т.е. если вы показываете первые 8 элементов в списке (так это те, которые видны на экране), и вы добавляете другой элемент между вторым и третьим элементами в списке, и вы вызываете notifyDataSetChanged() тогда getView() 8 раз, с позициями, начинающимися с 0 и заканчивающимися на 7, а потому, что в getView() вы получаете данные из ArrayList тогда он автоматически вернет новый элемент, вставленный в список, рядом с 7 из предыдущих 8 (7 а не 8, потому что последний элемент поместился на одну позицию вниз, поэтому он больше не виден), и ListView будет перерисовывать или что-то еще с этими элементами.

Также важно указать, что если вы правильно реализовали getView() , вы в конечном итоге переработаете объекты (объекты), которые уже были показаны (вместо создания новых). Посмотрите это видео около 12:00 минут, чтобы увидеть правильный способ реализации getView()

Я понял все это, поместив вызовы в LogCat в каждом методе и следуя за тем, что происходит.

Надеюсь, это поможет кому-то, кто только начинает понимать, как работает ListView .

PS Этот пример также помог мне понять.

BaseAdapter можно «наблюдать» другими classами. Когда вы вызываете метод ListView setAdapter() это вызовы registerDataSetObserver адаптера. Итак, адаптер знает, кто интересуется новыми данными.

Здесь вы можете проверить источник BaseAdapter . Это довольно мало.

notifyDataSetChanged доступен для вас, и вы не должны его переопределять (потому что он не делает ничего особенного, поэтому вы можете просто повторно использовать его в своем classе).

Предположим, что ваш ListView отображает некоторые данные, хранящиеся в ArrayList .

После того, как вы измените содержимое ArrayList , вам нужно сообщить списку, что источник данных был изменен, и ему нужно перерисовать его, чтобы показать новые данные.

Таким образом, здесь notifyDatasetChanged() . Он сообщает ListView что данные были изменены; и чтобы показать новые данные, ListView должен быть перерисован.

Поскольку вы расширяете BaseAdapter самостоятельно для создания подclassа, вы также получите notifyDataSetChanged() .

  • Getview Вызывается несколько раз в android
  • Скрытие ActionBar в RecyclerView / ListView onScroll
  • Android: реализация progressbar и «загрузка ...» для бесконечного списка, например Android Market
  • Ошибка Listview: «В вашем контенте должен быть ListView с атрибутом id« android.R.id.list »
  • Элемент списка избранных элементов Android ListView выделен
  • Android получает точную позицию прокрутки в ListView
  • В вашем контенте должен быть ListView с атрибутом id 'android.R.id.list'
  • Программно перейдите к определенной позиции в Android ListView
  • удалить несколько элементов в пользовательском listview
  • Push Listview, когда клавиатура появляется без настройкиPan
  • При проверке флажка в listview также проверяются другие случайные флажки
  • Давайте будем гением компьютера.