web-dev-qa-db-ja.com

Android RecyclerViewでexecutePendingBindingsを使用する理由

最近データバインディングを使用していて、executePendingBindingsメソッドに遭遇しました。ドキュメントはそれについてほとんど示しておらず、それがどのように機能するのか、いつ使用するのか理解できません。

多くの開発者がonBindViewHolderコールバック内で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();


}
11
Nick

バインディングに変更を加えても、Viewimmediateの影響があるとは限りません。バインディングで変更を行うということは、それらの変更が最も近い将来に適用されるように本当にスケジュールしているということです。これは多くの理由であり、パフォーマンスはその1つです。

Xmlにいくつかの複雑な式があると想像してください。すべての変数を設定する前に、変数のバインドに関連するすべてを把握する必要はありません。それは資源の浪費になります。

詳細については、生成されたバインディングJavaクラス自体を参照してください。これを一読することをお勧めします。

executePendingBindingsを呼び出すと、バインディングを呼び出す時点で、フレームワークにこれまでに必要なすべての処理を強制的に実行させることになります。

あなたのケースがそれを必要としない場合、あなたはあなたのアダプタでそれをするする必要はありません。一部の人々は、先に進む前にすべてがアイテムに適切に設定されていることを確認するためにそれを行っています。したがって、たとえば前のラウンドのバインディングが実行される前にonBindが再度呼び出されるようなケースはありません...または同様の...


編集1:

また...変更を実行するスケジュール(最も近い将来)は、setVariablesスレッドとは異なるスレッドからbindingUIを実行できることを忘れないでください。変数を設定してもView自体には影響しないためです。


編集2:

生成されたJava=クラスを確認する最も簡単な方法は、次のとおりです。

  1. ナビゲート->ファイル

navigate-file

  1. バインディングファイルの名前をUpperCamelCaseに入力し、その後にBindingを入力します(例:レイアウトがactivity_main、タイプActivityMainBinding

activity_main_binding

6
Bartek Lipinski

特筆すべきこともあります。 executePendingBindings()を呼び出すと、リストはこの呼び出しがない場合ほど滑らかではなくなります。 executePendingBindings()がUIスレッドで処理を行うので、 500要素のリストを想像してみてください。そして、UIでこのメソッドを呼び出すたびに。 「アプリケーションがメインスレッドで実行している作業が多すぎる可能性があります」と表示されます。

2
Artyom Shalaev