Ответ 1
Я понял это. Я не мог понять, как, черт возьми, начался адаптер и как он узнал, откуда взять данные. Когда я расширил класс BaseAdapter
, в конструкторе этого класса я инициализировал список элементов, которые я хотел видеть в ListView
. Но я не мог понять, как эти значения будут использоваться и когда.
Так вот вещь !!! :
В BaseAdapter
есть несколько методов, которые необходимо переопределить. Среди них есть getCount()
.
Когда ListView
создан и еще много чего, он вызывает getCount()
. Если это возвращает значение, отличное от 0 (я возвратил размер ArrayList, который я ранее инициализировал в конструкторе), то он вызывает getView()
достаточное количество раз, чтобы заполнить экран элементами. Например, я инициализировал ArrayList
с 20 элементами. Поскольку на экране изначально помещалось только 8 элементов, getView()
вызывался 8 раз, каждый раз запрашивая позицию, которую я должен был вернуть (точнее, он хотел знать, как будет выглядеть строка в списке в этой конкретной позиции). какие данные нужно было содержать). Если я прокручиваю список вниз, getView()
снова и снова, пока я не достигну конца списка, в моем случае 20 элементов/строк.
Что notifyDataSetChanged()
делает... при вызове он смотрит, какие элементы отображаются на экране в момент его вызова (точнее, какие индексы строк), и вызывает getView()
с этими позициями.
т.е. если вы отображаете первые 8 элементов в списке (то есть те, которые видны на экране), и вы добавляете другой элемент между 2-м и 3-м элементом в списке и вызываете notifyDataSetChanged()
тогда getView()
8 раз, с позициями, начинающимися с 0 и заканчивающимися на 7, и поскольку в getView()
вы получаете данные из ArrayList
он автоматически вернет новый элемент, вставленный в список, вместе с 7 из предыдущих 8 (7). а не 8, потому что последний элемент переместился на одну позицию вниз, так что он больше не виден), и ListView
будет перерисовывать, или что-то еще, с этими элементами.
Кроме того, важно указать, что если вы правильно реализовали getView()
, вы в конечном итоге переработаете уже отображенные элементы (объекты) (вместо создания новых). Посмотрите это видео примерно в 12:00 минут, чтобы увидеть правильный способ реализации getView()
Я понял все это путем размещения вызовов LogCat
в каждом методе и отслеживания происходящего.
Надеюсь, это поможет тому, кто только сейчас начинает понимать, как работает ListView
.
PS Этот пример также очень помог мне понять.
ОБНОВИТЬ
В настоящее время ListViews
больше не используются. Android выпустила RecyclerView
который выполняет переработку видов для вас, но знание основ ListView
помогает понять RecyclerView
.
Здесь ссылка для справки: https://developer.android.com/guide/topics/ui/layout/recyclerview