5

Mam bardzo konkretne pytanie. Używam android bibliotekę Databinding: https://developer.android.com/topic/libraries/data-binding/index.htmlBaza danych Androida w rozszerzalnym widoku listy

Mam datamodel takiego:

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 

używam również Getter i Setter dla wszystkich pól @Bindable.

Teraz mam działalność z krytym expandablelistview którym wiążę adapter do expandablelistview poprzez XML oraz niestandardowy @BindingAdapter takiego:

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

W pomocnika wiążącego klasy ta metoda statyczna

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

i wreszcie mój 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(); 
} 

mam jeszcze 2 xml Pliki Layout z powiązaniem danych layout.drink_list_item + layout.participant_list_item, które są powiązane z uczestnikiem i klasą napojów.

Pominąłem wiele kodu, który nie jest tutaj tak ważny. Wszystko działa dobrze, z wyjątkiem tego, że mam przycisk na moim layout.participant_list_item, który otworzy nowe działanie, w którym mogę dodać nowy napój do mojej listy napojów w moich dataclasses. Po zakończeniu działania do grupy należy dodać nowe dziecko. Ale będzie się wyświetlać tylko po tym, jak zwinę i rozwiną grupę raz. Zazwyczaj wiązanie danych robi to dla mnie, gdy wywołuję funkcję NotifyPropertychanged dla pola @Bindable lub jeśli dodaję nowy element do bezpośrednio związanego obiektu ObservableArrayList. Ale tak nie jest. Dodaję element do ObservableArrayList elementu w ObservableArrayList. Czy istnieje sposób na odświeżenie tylko dzieci z tej grupy? Czy moje podejście jest w jakiś sposób błędne?

Moje nieostrożne rozwiązanie polega na tym, że powiadam moje główne powiązanie działania w jego zdarzeniu onResume, że jeśli określony warunek zostanie spełniony, powinien odświeżyć wszystkie wiązania, co prowadzi do całkowitego odtworzenia działania ExpandableListView i wszystkich przedmioty zostaną ponownie zwinięte (co nie jest pożądanym zachowaniem).

Napisałem cały kod z mojej pamięci, ponieważ w tej chwili nie jestem w moim miejscu rozwoju. Ale ten problem dręczy mnie od wielu dni i nie znalazłem do tej pory przyzwoitego przykładu Databinding i ExpandableListView. Jeśli potrzebujesz więcej informacji, po prostu zapytaj.

Cieszę się z wszelkich wskazówek, które pomogą mi znaleźć dobre rozwiązanie.

To jest moje pierwsze pytanie tutaj, więc proszę bądź uprzejmy, jeśli post nie spełnia wszystkich wymagań.

Z góry dziękuję

// Edycja. Edytowano kod. Czy jest tu ktoś, kto ma jakieś pomocne uwagi? Czy potrzebujesz więcej kodu lub jak mogę dostać jakieś wskazówki ..

+0

używam do dokładnie tej kwestii, byłeś w stanie zrozumieć to? –

+0

Niestety nie, ponieważ był to projekt związany z hobby, utknąłem tam i nie znalazłem czystego rozwiązania. Użyłem więc metody odświeżania wszystkiego, co jest brzydkie, ale przynajmniej zadziałało. Jeśli znajdziesz właściwe rozwiązanie, daj mi znać. – Mono

Odpowiedz

2

Spróbuj ..

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

To mi nie pomoże, przepraszam. Wiem, jak powiązać listy z listview. Jak widać w moim poście, używam rozwijanego listview, w którym mam GetChildView i GetGroupView i wiążę moje listy z nim. Problem polega na tym, jak zaktualizować widok, gdy lista powiązań zmienia się w podglądzie. – Mono

+0

wypróbuj nową wersję –

+0

Wygląda obiecująco, spróbuję, kiedy dostanę czas i udzielę informacji zwrotnej. Do tej pory. – Mono