0

Androidデータバインディングは興味深いツールですが、Androidの(過度に)複雑なアーキテクチャにはうまく対応していません。多くのサンプルまたはチュートリアルでは、明らかに機能する基本的なシナリオの一部しか表示されませんが、状況が厳しくなると問題が発生します。Androidデータバインディング疑問

例:多くのビュー(RecyclerViewやViewPagerなど)にはContextを必要とするアダプタやデコレータが必要であり、レイヤの分離を壊すため、すべてのViewModelにコンテキストを渡すのは間違っているようです。

ViewFlipper:ViewModelのプロパティをバインドするだけで、次回または前回の表示方法を教えてください。

リサイクルビューをLinearLayout、ItemAnimation、およびItemDecorationとバインドするにはどうすればよいですか?あなたは現実世界の複雑なAndroid Data Bindingの実例を職場で見せていただけますか?

+1

をなぜあなたは 'コンテキストを渡す必要があります:

は、私はそれがすでにセッターを持っているので、あなたが属性を使用するために特別なBindingAdapterは必要ありませんが、それはまたItemAnimatorについてのご質問に答える必要があります期待します'RecyclerView'を使うときは? – pskink

+0

あなたの質問は非常に一般的です。答えるためにエッセイ全体を必要としないように少しだけ指定することはできますか? – tynn

+0

[This](http://saulmm.github.io/from-design-to-android-part1)は、単純なバインディング以上のものを扱う例です。それは 'ViewFlipper'を持っています。 – yennsarah

答えて

3

あなたはこれら二つの記事に興味があるかもしれません:RecyclerViewでデータバインディングを使用した上で

https://medium.com/google-developers/android-data-binding-recyclerview-db7c40d9f0e4

RecyclerViewせずにリストをデータバインディングを使用した上で(例のLinearLayout): https://medium.com/google-developers/android-data-binding-list-tricks-ef3d5630555e

付きItemDecorationでは、独自のBindingAdapterを追加する必要があります。これは、RecyclerViewが複数のアイテムの装飾を許可するためです。このようなものはうまくいくはずです:

@BindingAdapter("itemDecoration") 
public static void setItemDecoration(RecyclerView view, ItemDecoration old, 
     ItemDecoration newVal) { 
    if (old != null) { 
     view.removeItemDecoration(old); 
    } 
    if (newVal != null) { 
     view.addItemDecoration(newVal); 
    } 
} 

Contextに関するご質問はちょっと混乱します。私はあなたがデータバインディングでどのようにコンテキストを必要とするか想像しようとしています。データバインディング式ではnewが許可されていないため、そのように作成することはできません。

@BindingAdapter("dividerDirection") 
public static void setItemDecoration(RecyclerView view, int oldDirection, int newDirection) { 
    if (oldDirection != newDirection) { 
     ItemDecoration decoration = 
       new DividerItemDecoration(view.getContext(), newDirection); 
     ItemDecoration old = ListenerUtil.trackListener(view, decoration, R.id.decoration); 
     if (old != null) { 
      view.removeItemDecoration(old); 
     } 
     view.addItemDecoration(decoration); 
    } 
} 

、それは次のようにバインドされます:おそらく、あなたの代わりに、いくつかの表現を使用して考えている他の用途のために

<android.support.v7.widget.RecyclerView 
    app:dividerDirection="@{DividerItemDecoration.HORIZONTAL}" .../> 

、あなたは自動的に内蔵の「コンテキスト」変数を付与されていますあなたのレイアウトとあなたはあなたが呼び出す方法にそれを渡すことができます。これは、バインドされたビュー階層のルートビューのコンテキストであり、ほとんどのニーズに対応する必要があります。ほとんどの用途では、モデルのコンテキストを渡す必要はありません。

<android.support.v7.widget.RecyclerView 
    app:itemAnimator="@{model.animator}" .../> 
+0

ジョージに感謝します。私も混乱しているので、私の質問は混乱しています。しかし、あなたはテーブルに興味深いアイデアを載せています。すでに知られているものもあれば、新しいものもあります。:) – Alessandro

+0

ItemDecorationの例で、DimensionリソースにアクセスするためにItemDecorationがContextを必要とする場合はどうすればよいですか? ViewからContextを渡さずにViewModelからインスタンスを作成するにはどうすればよいですか? – Alessandro

+0

簡単な方法は、次元を属性 'app:dividerWidth =" @ {@ dim/thickDivider} "'として渡すことです。複数属性のBindingAdapterが必要です。 –