Ответ 1
Позвольте мне начать с немного фона (который вы уже можете понять, но нужно объяснить onBindViewHolder()
).
RecyclerView
предназначен для отображения длинных списков (или решеток) элементов. Предположим, вы хотите отобразить 100 строк. Простым подходом было бы просто создать 100 просмотров, по одному для каждой строки и выложить все из них. Но это было бы расточительно, потому что большинство из них было бы отключено от экрана, потому что позволяет говорить, что только 10 из них подходят на экране.
Итак, RecyclerView
вместо этого создает только 10 представлений, которые находятся на экране. Таким образом, вы получаете 10-кратную скорость и использование памяти. Но что происходит, когда вы начинаете прокрутку и вам нужно начинать показывать следующие виды?
Снова простой подход состоял бы в создании нового представления для каждой новой строки, которую нужно показать. Но таким образом, когда вы достигнете конца списка, вы создадите 100 просмотров, а использование вашей памяти будет таким же, как и в первом подходе. И создание просмотров требует времени, поэтому ваша прокрутка, скорее всего, не будет гладкой.
Вот почему RecyclerView
использует тот факт, что при прокрутке и появлении новых строк на экране также исчезают старые строки. Вместо создания нового представления для каждой новой строки старое представление переработано и повторно используется путем привязки к нему новых данных.
Это происходит именно в onBindViewHolder()
. Первоначально вы получите новых неиспользованных держателей, и вы должны заполнить их данными, которые вы хотите отобразить. Но при прокрутке вы начнете получать держатели для просмотра, которые использовались для строк, которые выходили из экрана, и вам нужно заменить старые данные, которые они хранят с новыми данными.