2016-04-14 9 views
4

Ich bin in der Lage, "activity-wide" Datenbindung ohne Probleme zu arbeiten. Wenn ich jedoch versuche, Bindungen für bestimmte Ansichten zu erstellen, z. B. überhöhte Ansichten, die ich programmatisch zu einem LinearLayout hinzufüge, funktioniert nichts, was ich versucht habe.Android Data Binding auf einzelne Ansichten hinzugefügt zu LinearLayout programmatisch?

Beispielsweise ist das Binden von Daten an die Ansicht einer Aktivität trivial. In der OnCreate() Methode muss man nur hinzufügen:

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

Das war's! Die Ansicht main_activity.xml wird durch Magie an die Bindung gebunden (dies ist mein Problem) und die Variablensubstitution funktioniert wie erwartet in der Datei main_activity.xml.

Ich konsultierte Googles Dokumentation bezüglich RecyclerView Verwendung und versuchte, diese Methode in meinen überhöhten Ansichten zu verwenden. Ich tat dies, indem ich ein ListItemBinding (meine .xml heißt nur list_item.xml und diese Datei wurde automatisch vom .xml-Layout erzeugt) für jeden ViewHolder, die ListItemBinding an den ViewHolder übergeben, um als Referenz durchgehalten zu werden der Konstruktor jedes ViewHolders.

Jetzt funktioniert das natürlich nicht, und ich vermute, dass der Grund dafür ist, dass es keine explizite Verbindung zwischen meiner Ansicht und der Bindung gibt. Es gibt jedoch keine Verbindung zwischen der obigen Aktivität und der Bindung funktioniert es?

Ich greife in den Quellcode, um zu sehen, wie die Bindung auf Aktivitäten funktioniert, ich bin mir sicher, dass das meine Antwort haben wird, aber wenn jemand anderes vor mehreren Stunden spielen kann, würde ich mich über den Kopf freuen. Anfang!

Ich werde alle Ergebnisse hier berichtet, vielen Dank

+0

Es gibt einige Tricks, um mit Android Data Binding mit RecyclerView. Werfen Sie einen Blick auf diesen Vortrag https://realm.io/news/data-binding-android-boyar-mount/ - ungefähr 22 Minuten später spricht Yigit darüber, wie Datenbindung mit RecyclerView verwendet werden kann. –

+0

@GeorgeMount Ich wollte eigentlich keinen RecyclerView verwenden, da es nur 5 Ansichten pro Liste gibt, so dass nicht viel Recycling gemacht werden muss ... Wie auch immer, ich habe auf die richtigen RecyclerViews gewechselt, indem ich ein LinearLayout verwendet habe individuell dazu. Es war sehr einfach und der zusätzliche Aufwand ist wahrscheinlich den direkten Ansatz wert. – AutoM8R

Antwort

9

Sie aufgeblasene dynamisch Daten hinzufügen können Ansichten auf ein Linearlayout gebunden. Sie müssen die Daten für die datengebundene Ansicht programmgesteuert festlegen.

Wenn es eine bekannte Bindung gibt, an die Sie anhängen, können Sie stattdessen die Daten von dort abrufen. Hier nehme ich an, dass die enthaltene ViewGroup in einem Layout ist und die Bindung OuterBinding generiert wurde.

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()); 
} 

können Sie sehen, dass es keine direkte Bindung zwischen den OuterBinding ist ‚s Benutzer und MyLayoutBinding‘ s Benutzer. Das heißt, wenn Sie es aktualisieren, wird es nicht angezeigt. Mit eingebundenen Layouts funktioniert das Framework, um es zu binden, was Sie manuell tun müssen. Um dynamische Updates zu erhalten, können Sie es auf diese Weise tun:

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