2016-05-30 2 views
19

Я новичок, и у меня возникли проблемы с пониманием фрагмента кода. Может кто-нибудь, пожалуйста, объясните мне, когда эта функция вызывает и для чего?Когда вызывается onBindViewHolder и как он работает?

Вот мой код:

public void onBindViewHolder(myViewHolder holder, int position) { 

     RecViewHolder currentdata = data.get(position); 
     holder.favChecker = currentdata.getFavChecker(); 
     holder.serialID = currentdata.getSerialID(); 
     holder.theClassName = currentdata.getTheClassName(); 
} 
+0

, пожалуйста, напишите свой код – Nisarg

+1

проверьте эту надежду, это поможет вам https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html –

+0

спасибо @PradeepGupta, но я все еще запутался, когда это называется. – Shubh

ответ

64

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

RecyclerView предназначен для отображения длинных списков (или сеток) предметов. Предположим, вы хотите отобразить 100 строк. Простым подходом было бы просто создать 100 просмотров, по одному для каждой строки и выложить все из них. Но это было бы расточительно, потому что большинство из них было бы выключено, потому что позволяет сказать, что только 10 из них подходят на экране.

Таким образом, RecyclerView вместо этого создает только 10 видов, которые находятся на экране. Таким образом, вы получаете 10-кратную скорость и использование памяти. Но что происходит, когда вы начинаете прокрутку и вам нужно начинать показывать следующие виды?

Снова простой подход заключается в создании нового представления для каждой новой строки, которую необходимо показать. Но таким образом, когда вы достигнете конца списка, вы создадите 100 просмотров, а использование вашей памяти будет таким же, как и в первом подходе. И создание просмотров требует времени, поэтому ваша прокрутка, скорее всего, не будет гладкой.

Именно поэтому RecyclerView использует тот факт, что при прокрутке и появлении новых строк на экране также исчезают старые строки. Вместо создания нового представления для каждой новой строки старое представление переработано и повторно используется путем привязки к нему новых данных.

Это происходит точно в onBindViewHolder(). Первоначально вы получите новых неиспользованных держателей, и вы должны заполнить их данными, которые вы хотите отобразить. Но при прокрутке вы начнете получать держатели для просмотра, которые использовались для строк, которые выходили из экрана, и вы должны заменить старые данные, которые они хранят с новыми данными.

+0

Спасибо @Marcin, это было отличное объяснение. – Shubh

+0

Великие и простое объяснение, спасибо –

+1

с обновлением в SDK теперь я получил другое поведение, т.е. onBindViewHolder является придирчиво призывающим. – Abhishek

1

Он Вызывается RecyclerView, чтобы отобразить данные в указанной позиции. Этот метод должен обновлять содержимое itemView, чтобы отразить элемент в данной позиции.

для получения дополнительной информации ознакомьтесь RecyclerView.Adapter#onBindViewHolder

Смежные вопросы