2016-04-14 1 views
4

「アクティビティ全体」のデータバインディングを何ら問題なく動作させることができました。しかし、特定のビューのバインディングをセットアップしようとすると、プログラムがLinearLayoutに追加している膨らんだビューなど、何も試したことがありません。個々のビューのAndroidデータバインディングは、プログラムによってLinearLayoutに追加されましたか?

たとえば、アクティビティのビューへのデータのバインドは簡単です。通常onCreate()メソッドでは、次のものを追加するだけです。

MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity); 
User user = new User("Test", "User"); 
binding.setUser(user); 

これだけです! main_activity.xmlのビューはいくつかの魔法を介してバインディングにバインドされます(これは私の問題です)、main_activity.xmlで変数の置換が期待通りに機能します。

私は、RecyclerViewの使用に関するGoogleの文書を参照し、膨大なビューでこの方法を利用しようとしました。私はListItemBinding(私の.xmlは単にlist_item.xmlと呼ばれ、このファイルは.xmlレイアウトから自動的に生成されます)を作成することでこれを行いました.ListItemBindingはViewHolderに渡され、各ViewHolderのコンストラクタ

これはうまくいきませんが、これは私のビューとバインディングの間に明示的な結びつきがないことを推測していますが、上記のアクティビティとバインディングの間には関係がありませんそれは動作しますか?

アクティビティでバインディングがどのように機能しているかを確認するにはソースコードを掘り下げていますが、私の回答は確実ですが、他の人が複数時間を費やす前にチャイムインすることができれば、開始!

私はあなたがのLinearLayoutにビューをバインド動的に膨張したデータを追加することができ、非常に

+0

RecyclerViewでAndroidデータバインディングを使用するには、いくつかのトリックがあります。この話を見てくださいhttps://realm.io/news/data-binding-android-boyar-mount/ - 約22分で、YigitはRecyclerViewでデータバインディングを使用する方法を話します。 –

+0

@GeorgeMount実際にはRecyclerViewを使用したくないのですが、リストあたり最大5つのビューしかないので、多くのリサイクルはできません...とにかく、私はLinearLayoutを使って適切なRecyclerViewsに切り替えてビューを追加しました個別にそれに。非常に簡単で余分なオーバーヘッドはおそらく簡単なアプローチに値するでしょう。 – AutoM8R

答えて

9

をありがとう、ここにすべての調査結果を報告します。データバインドビューのデータをプログラムで設定する必要があります。

void addViewToViewGroup(ViewGroup viewGroup, User user) { 
    LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext()); 
    MyLayoutBinding binding = MyLayoutBinding.inflate(inflater, viewGroup,true); 
    binding.setUser(user); 
} 

あなたが接続している既知のバインディングがある場合は、そこからデータを引き出すことができます。ここでは、含まれているViewGroupがレイアウトouter.xmlにあり、生成されたバインドOuterBindingと仮定します。

void addViewToViewGroup(ViewGroup viewGroup) { 
    OuterBinding outer = DataBindingUtil.findBinding(viewGroup); 
    LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext()); 
    MyLayoutBinding binding = MyLayoutBinding.inflate(inflater, viewGroup, true); 
    binding.setUser(outer.getUser()); 
} 

あなたはOuterBindingのユーザーとMyLayoutBindingのユーザーとの間には直接的な結合が存在しないことがわかります。つまり、更新すれば反映されません。含まれているレイアウトでは、フレームワークは手動で行う必要があるバインディングに機能します。動的更新を取得するには、次のようにします。

outer.addOnPropertyChangedCallback(new OnPropertyChangedCallback() { 
    @Override 
    public void onPropertyChanged(Observable sender, int propertyId) { 
     if (propertyId == BR.user) { 
      binding.setUser(outer.getUser()); 
      break; 
     } 
    } 
}); 
関連する問題