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 ..
używam do dokładnie tej kwestii, byłeś w stanie zrozumieć to? –
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