В последнее время я использовал привязки данных и наткнулся на метод executePendingBindings
.
В документации об этом мало говорится, поэтому я не понимаю, как это работает и когда его использовать. Вот пример использования метода.
Приведите пример, демонстрирующий разницу в использовании и использовании. Спасибо
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
Customer customer= List.get(position).second;
((CustomerViewHolder)holder).binding.setCustomer (customer)
((CustomerViewHolder)holder).binding.executePendingBindings();
}
Функция executePendingBindings()
предназначена для немедленного связывания.
Когда изменяется переменная или наблюдаемый объект, привязка планируется изменить до следующего кадра. Однако бывают случаи, когда привязка должна выполняться немедленно. Для принудительного выполнения используйте метод executePendingBindings ().
Это означает, что представление становится недействительным или обновляется немедленно при изменении этого значения.
Однако в recyclerView нет никаких различий, если поместить внутрь onBindViewHolder, но большинство людей считают важным разместить его там.
Это похоже на совет по оптимизации. он заставляет привязку данных выполняться немедленно, что позволяет RecyclerView производить правильные измерения размера представления
Для более подробного объяснения вы можете обратиться к этому примеру.
Когда вы не используете executePendingBindings()
, ваш список будет мерцать, когда вы его привязываете, например, когда вы открываете новый список, вы заметите этот эффект мерцания / дрожания, это связано с тем, что список заполняется, а затем в следующем кадре он привязан.
Если вы не хотите, чтобы это произошло и выполнялось немедленно, ваша привязка этого метода предотвратит мерцание и сразу же привяжет ваши данные.
executePendingBindings()
Если вы видите, появляется эффект мерцания, так как представления инициализируются, затем выполняется привязка данных, а затем в следующем кадре происходит привязка представления.
executePendingBindings()
Если вы видите здесь, эффекта мерцания нет, вы можете видеть, что список имеет обычную привязку и работает как единое целое.
Вы можете использовать executePendingBindings()
только в потоке пользовательского интерфейса, это означает, что во время вызова onBindViewHolder
вам нужно будет использовать его в привязке, это гарантирует, что вы вызываете его в пользовательском интерфейсе.
override fun onBindViewHolder(binding: MyBindingClass, position: Int, viewType: Int) {
//Your binding code
binding.executePendingBindings()
}
Всегда вызывайте его в конце onBindViewHolder
Что вы имеете в виду под «изменением до следующего кадра»?