5

Ich habe eine sehr spezifische Frage. Ich bin mit dem Android-Bibliothek Databinding: https://developer.android.com/topic/libraries/data-binding/index.htmlAndroid Datenbindung in einem erweiterbaren Listenansicht

Ich habe ein Datenmodell wie folgt aus:

Class Participant 
Public String Name; 
//and so on 
Public ObservableArrayList<Drink> DrinkList; 
End Class 
Class Drink extends BaseObservable 
@Bindable 
Public String Name; 
@Bindable 
Public Float Price; 
End Class 

Ansichtsmodell:

Class ParticipantList 
public ObservableArrayList<Participant> list = new ObservableArrayList<>(); 
//some Methods to add items and concstructor 

Ich benutze auch Getter und Setter für alle @Bindable Felder aus.

Jetzt habe ich eine Tätigkeit mit einem expandablelistview, wo ich einen Adapter an die expandablelistview via XML und eine benutzerdefinierte @BindingAdapter wie diese binden:

//in XML for the layout 
<layout xmlns:bind="http://schemas.android.com/apk/res-auto" 
    <data> 
     <variable name="Participants" type="com.example.ParticipantList"/> 
    </data> 
<ExpandableListview> 
<bind:participants=Particpants.list> 

In einem Bindungs ​​Helfer Klasse diese statische Methode

@BindingAdapter("participants") 
public static void bindList(ExpandableListView view, ObservableArrayList<Participant> list) { 
    ParticipantListAdapter adapter = new ParticipantListAdapter(list); 
    view.setAdapter(adapter); 
} 

und schließlich mein Adapter:

Class ParticpantListAdapter Extends ExpandableListAdapter { 
public ObservableArrayList<Participant> list; 
@Override 
public View getGroupView(..) 
ParticipantListItemBinding binding = DataBindingUtil.inflate(inflater,R.layout.participant_list_item, parent, false); 
binding.setParticipant(list.get(groupposition)); 
return binding.getRoot(); 
} 
@Override 
public View getChildView(..) { 
DrinkListItemBinding binding = DataBindingUtil.inflate(inflater, R.layout.drink_list_item, parent, false); 
binding.setDrink(list.get(goupposition).DrinkList.get(childposition)); 
return binding.getRoot(); 
} 

ich habe 2 mehr xml LayoutFiles mit Datenbindung layout.drink_list_item + layout.participant_list_item, die an den Teilnehmer und an die Getränkeklasse gebunden sind.

Ich habe eine Menge Code übersprungen, was hier nicht wirklich wichtig ist. Alles funktioniert gut, außer dass ich einen Button in meinem layout.participant_list_item habe, der eine neue Aktivität öffnet, in der ich ein neues Getränk zu meiner Drinkliste in meinen Datenklassen hinzufügen kann. Wenn ich die Aktivität beende, sollte ein neues Kind zu der Gruppe hinzugefügt werden. Aber es wird erst nach dem Zusammenbruch angezeigt und die Gruppe einmal erweitert. Normalerweise funktioniert das für mich, wenn ich NotifyProperty für ein @Bindable-Feld aufruft oder wenn ich ein neues Objekt zu einer direkt gebundenen ObservableArrayList hinzufüge. Aber das ist nicht der Fall. Ich füge ein Objekt einer ObservableArrayList eines Objekts in einer ObservableArrayList hinzu. Gibt es eine Möglichkeit, nur die Kinder dieser Gruppe aufzufrischen? Oder ist mein Ansatz irgendwie falsch?

Meine schmutzige Lösung ist in dem Moment, dass ich meine Hauptbindung der Aktivität in seinem onResume-Ereignis sagen, dass, wenn eine bestimmte Bedingung erfüllt ist, sollte es alle Bindungen aktualisieren, was zu einem vollständigen Neuzeichnen der ExpandableListView-Aktivität führt Die Objekte werden wieder ausgeblendet (was kein gewünschtes Verhalten ist).

Ich habe den ganzen Code aus meinem Gedächtnis geschrieben, da ich momentan nicht an meinem Entwicklungsort bin. Aber dieses Problem stört mich seit Tagen und ich konnte bisher kein anständiges Beispiel für Databinding und ExpandableListView finden. Wenn Sie mehr Informationen benötigen, fragen Sie einfach.

Ich freue mich für Hinweise, die mir helfen, eine gute Lösung zu finden.

Dies ist meine erste Frage hier also bitte sei nett, wenn der Beitrag nicht alle Anforderungen erfüllt.

Vielen Dank im Voraus

// Bearbeiten. Hat einen Code bearbeitet. Ist hier jemand, der einen hilfreichen Kommentar hat? Sie benötigen mehr Code benötigen oder wie kann ich ein paar Tipps bekommen ..

+0

Ich laufe in genau dieses Problem, sind Sie in der Lage, es herauszufinden? –

+0

Leider nicht, da es ein Hobbyprojekt war, bin ich dort steckengeblieben und habe keine saubere Lösung gefunden. Also habe ich die Refresh-Binding-Methode verwendet, die zwar hässlich ist, aber zumindest funktioniert. Wenn Sie eine richtige Lösung finden, lassen Sie es mich wissen. – Mono

Antwort

2

die Sie interessieren ..

public class IExpandableListViewAdapter extends BaseExpandableListAdapter { 
    @Override 
    public int getGroupCount() { 
     return 0; 
    } 

    @Override 
    public int getChildrenCount(int i) { 
     return 0; 
    } 

    @Override 
    public Object getGroup(int i) { 
     return null; 
    } 

    @Override 
    public Object getChild(int i, int i1) { 
     return null; 
    } 

    @Override 
    public long getGroupId(int i) { 
     return 0; 
    } 

    @Override 
    public long getChildId(int i, int i1) { 
     return 0; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return false; 
    } 

    @Override 
    public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) { 
     if(view == null) { 
      parentBinding = DataBindingUtil.inflate(LayoutInflater.from(viewGroup.getContext()), R.layout.basket_list_layout, viewGroup, false); 
      view = parentBinding.getRoot(); 
     } 
     else { 
      parentBinding = (BasketListLayoutBinding)view.getTag(); 
     } 
     parentBinding.setBasketParentModel(parent.get(i)); 
     view.setTag(parentBinding); 
     return view; 
    } 

    @Override 
    public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) { 
     final int index = i; 
     if(view == null) { 
      childBinding = DataBindingUtil.inflate(LayoutInflater.from(viewGroup.getContext()), R.layout.basket_detail_layout, viewGroup, false); 
      view = childBinding.getRoot(); 
     } 
     else { 
      childBinding = (BasketDetailLayoutBinding) view.getTag(); 
     } 
     childBinding.setBasketChildModel(parent.get(i).getBasketChildModel()); 
     view.setTag(childBinding); 
     return view; 
    } 

    @Override 
    public boolean isChildSelectable(int i, int i1) { 
     return false; 
    } 
} 
+0

Das hilft mir nicht leid. Ich weiß, wie man Listen an eine Listenansicht bindet. Wie Sie in meinem Post sehen können, benutze ich eine erweiterbare Listview, in der ich GetChildView und GetGroupView habe und meine Listen an sie gebunden habe. Das Problem, das ich habe, ist, wie man die Ansicht aktualisiert, wenn sich die gebundene Liste in der Kindansicht ändert. – Mono

+0

neue Version versuchen –

+0

Sieht vielversprechend aus, ich werde es versuchen, wenn ich Zeit bekomme und Ihnen Feedback geben. Danke so weit. – Mono