Андроид. Как работает метод notifyDataSetChanged () и ListViews?
Я пытаюсь понять и как это работает, и я пытаюсь создать свой собственный адаптер, который расширяет BaseAdapter. Ибо ArrayAdapter например, есть notifyDataSetChanged() метод, который должен быть вызван после того, как вы обновили список массивов, который содержит все ваши данные, чтобы обновить ListView.
но я создаю свой собственный подкласс BaseAdapter. Этот метод мне недоступен, или нет? Как реализовать этот метод? В принципе, что делает этот метод именно, может быть, тогда я пойму.
в случае ArrayAdapter Я предполагаю, что он смотрит на какую позицию ListView в настоящее время отображается, и он проверяет, является ли он таким же, как в ArrayList после того, как он был обновлен? Или...
он говорит, что метод:
уведомляет прикрепленных наблюдателей о том, что базовые данные были
изменено и любое представление, отражающее набор данных, должно обновиться.
но как именно это происходит обновить себя?
может кто-нибудь объяснить, пожалуйста?
4 ответов:
я понял. Я не мог понять, как, черт возьми, адаптер начал и как он знал, откуда взять данные. Когда я расширил
BaseAdapterкласс, в конструкторе этого класса я инициализировал список элементов, которые я хотел видеть вListView. Но я не мог понять, как эти значения будут использоваться и когда.так вот в чем дело !!! :
на
BaseAdapterесть некоторые методы, которые должны быть переопределенный. Среди них естьgetCount().когда
ListViewсоздается и еще много чего, он вызываетgetCount(). Если это возвращает значение, отличное от 0 (я вернул размер ArrayList, который я ранее инициализировал в конструкторе), то он вызываетgetView()достаточное количество раз, чтобы заполнить экран с элементами. например, я инициализировалArrayListС 20 пунктов. Потому что только 8 предметов изначально помещаются на экране,getView()был вызван 8 раз, каждый раз прося позиция, которую он требовал для меня, чтобы вернуться (точнее, он хотел знать, как строка будет выглядеть в списке на этой конкретной позиции, какие данные она должна содержать). Если я прокручиваю список,getView()вызывается снова и снова, 'til я попал в конец списка, в моем случае 20 элементов / строк.что
notifyDataSetChanged()делает ... при вызове он смотрит, какие элементы отображаются на экране в момент его вызова (точнее, какие индексы строк ) и вызываетgetView()с этими позициями.т. е. если вы показываете первые 8 элементов в списке (так что это те, которые видны на экране), и вы добавляете еще один элемент между 2-м и 3-м элементом в списке, и вы вызываете
notifyDataSetChanged()затемgetView()вызывается 8 раз, причем позиции начинаются от 0 и заканчиваются на 7, а потому вgetView()метод вы получаете данные отArrayListзатем он автоматически вернет новый элемент, вставленный в список вместе с 7 из списка предыдущие 8 (7 и не 8, потому что последний элемент пошел на одну позицию вниз, поэтому он больше не виден), аListViewбудет перерисовывать, или что-то еще, с этими элементами.кроме того, важно указать, что если вы используете
getView()правильно, вы в конечном итоге переработаете уже отображенные элементы (объекты) (вместо создания новых). Смотрите видео примерно в 12: 00 минут, чтобы увидеть правильный способ реализацииgetView()я понял все это, сделав звонки
LogCatв каждом методе и после того, что происходит.надеюсь, это поможет кому-то, кто только сейчас начинает понимать, как
ListViews работа.П. С. также помогло мне многое понять.
BaseAdapterможет "наблюдаться" другими классами. Когда вы вызываете методListViewэтоregisterDataSetObserverадаптер. Таким образом, адаптер знает, кто заинтересован в новых данных.вы можете проверить источник
BaseAdapterздесь. Он довольно маленький.
notifyDataSetChangedи доступно для вас, и вы в основном не должны переопределять его (потому что он не делает ничего особенного, поэтому вы можете просто использовать его в своем собственном классе).
Предположим ваш
ListViewотображает некоторые данные, хранящиеся вArrayList.после изменения содержимого
ArrayList, вам нужно сообщить списку, что источник данных изменился, и ему нужно перерисовать себя, чтобы показать новые данные.вот здесь
notifyDatasetChanged()приходит. Это говоритListView, что данные были изменены; и чтобы показать новые данные,ListViewдолжно быть переписано.
Как вы расширяете
BaseAdapterдля вашего собственного для создания подкласса, вы получитеnotifyDataSetChanged()способ также.
Comments