Ho una domanda molto specifica. Sto usando la libreria di associazione dati Android: https://developer.android.com/topic/libraries/data-binding/index.htmlAssociazione dati Android in una lista espandibile lista
Ho un datamodel come questo:
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
ViewModel:
Class ParticipantList
public ObservableArrayList<Participant> list = new ObservableArrayList<>();
//some Methods to add items and concstructor
Io uso anche getter e setter per tutti i campi @Bindable.
Ora ho un'attività con un expandablelistview in cui mi legano un adattatore per l'expandablelistview tramite XML e un @BindingAdapter personalizzato come questo: questo metodo statico
//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 una classe di supporto vincolante
@BindingAdapter("participants")
public static void bindList(ExpandableListView view, ObservableArrayList<Participant> list) {
ParticipantListAdapter adapter = new ParticipantListAdapter(list);
view.setAdapter(adapter);
}
e, infine, il mio adattatore:
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();
}
ho più 2 xml LayoutFile con associazione dati layout.drink_list_item + layout.participant_list_item che sono legati al partecipante e alla classe bevanda.
Ho saltato un sacco di codice che non è molto importante qui. Tutto funziona bene, tranne che ho un pulsante nel mio layout.participant_list_item che aprirà una nuova attività in cui posso aggiungere un nuovo drink alla mia lista delle bevande nei miei dataclass. Quando finisco l'attività, dovrebbe essere aggiunto un nuovo bambino al gruppo. Ma verrà visualizzato solo dopo che collasso e si espande il gruppo una volta. Solitamente il databinding lo fa per me quando chiamo NotifyPropertychanged per un campo @Bindable o se aggiungo un nuovo item a ObservableArrayList direttamente associato. Ma questo non è il caso. Aggiungo un oggetto a ObservableArrayList di un oggetto in ObservableArrayList. C'è un modo per aggiornare solo i bambini di quel gruppo? O il mio approccio è in qualche modo sbagliato?
La mia soluzione sporca è al momento in cui dico al mio binding principale dell'attività nel suo evento onResume che se viene soddisfatta una determinata condizione, deve aggiornare tutti i binding che portano a un ridisegno completo dell'attività ExpandableListView e a tutti gli articoli saranno nuovamente compressi (il che non è un comportamento desiderato).
Ho scritto tutto il codice dalla mia memoria poiché non mi trovo nel mio posto di sviluppo al momento. Ma questo problema mi infastidisce da giorni e non sono riuscito a trovare un esempio decente di Databinding e ExpandableListView finora. Se hai bisogno di maggiori informazioni basta chiedere.
Sono felice per qualsiasi suggerimento che mi aiuti a trovare una soluzione piacevole.
Questa è la mia prima domanda qui, quindi per favore sii gentile se il post non soddisfa tutti i requisiti.
Grazie in anticipo
// Modifica. Modificato un codice. C'è qualcuno qui che ha qualche commento utile? Occorrono maggiori codice o come posso ottenere alcuni consigli ..
Sono in esecuzione in questo problema esatto, sono stati in grado di capirlo? –
Purtroppo no, dato che era un progetto per hobby mi sono bloccato lì e non ho trovato una soluzione pulita. Quindi ho usato l'aggiornamento di tutti i metodi di rilegatura, che è brutto ma almeno ha funzionato. Se trovi una soluzione adeguata fammi sapere. – Mono