🦑
【Android】RecyclerView で DataBinding を使うときは executePendingBindings が必要
RecyclerView
でデータバインディングを使っていたのですが、リストアイテムのレイアウトサイズが異なる画面でスクロールするとカクツクような動きをしたので、改善策を探していたところ、executePendingBindings
というメソッドの存在を知りました。
executePendingBindings について
executePendingBindings
は 即時バインディング といいます。
通常のバインディングでは、レイアウトに定義した変数が変更されると、次のフレームの前に変更されるようスケジュールが設定されるので、すぐに内容が反映されません。
なので、スクロールしてレイアウトが表示されたときに遅れて、バインディングを反映した後に、バインディングされた変数の内容で View のサイズが変わる ということが起きて、カクついて見えていたんだと思います。
そこで、バインディングした後にexecutePendingBindings
を呼び出すことで、変更内容をすぐに反映させることが出来ます。
実装例 : User オブジェクトをセットする
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="user"
type="com.example.executependingbindingssample.User" />
</data>
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val user = getItem(position)
holder.binding.user = user
// バインディングした後に呼び出す
holder.binding.executePendingBindings()
}
Discussion