5

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 ..

+0

Sono in esecuzione in questo problema esatto, sono stati in grado di capirlo? –

+0

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

risposta

2

Prova questa ..

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

Questo non mi aiuta scusa. So come associare le liste ad un listview. Come puoi vedere nel mio post, utilizzo un listview espandibile in cui ho GetChildView e GetGroupView e ci legano i miei elenchi. Il problema che ho è come aggiornare la vista quando la lista dei limiti cambia in childview. – Mono

+0

prova la nuova versione –

+0

Sembra promettente, ci proverò quando avrò tempo e ti darò un feedback. Thx finora. – Mono

Problemi correlati