🦑

【Android】RecyclerView で DataBinding を使うときは executePendingBindings が必要

2022/01/10に公開

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