Lesen der Google docs Ich fand (Sorte) ein Beispiel für die Verwendung einer selectedItem
, um ein Ereignis zu anderen Beobachtern zu verbreiten, das ist meine aktuelle Implementierung:MVVM // ViewModel Ereignis ausgelöst Aktivität Drehung (neu erstellt)
Ansichtsmodell
public void onListItemClicked(Item item) {
if (selectedItem.getValue() == item) {
return;
}
selectedItem.postValue(item);
}
public LiveData<Item> getSelectedItem() {
if (selectedItem == null) {
selectedItem = new MutableLiveData<>();
}
return selectedItem;
}
Ansicht
ListViewModel viewModel = ViewModelProviders.of(this).get(ListViewModel.class);
viewModel.getSelectedItem().observe(this, new Observer<Item>() {
@Override
public void onChanged(@Nullable Item item) {
if (item != null) {
openDetailActivity(item);
}
}
});
Und wenn der Benutzer die Liste klickt:
@Override
public void onItemClicked(Item item) {
viewModel.onListItemClicked(item);
}
Alle gut und alle es, das Problem ist, funktioniert, wenn der Benutzer den Bildschirm dreht und die ListActivity
neu erstellt erkennt eine Änderung und öffnet die DetailActivity
beim Abonnieren.
Ich fand eine Abhilfe, die selectedItem.postValue(null);
auf der getSelectedItem()
hinzufügen, aber es ist ein wenig hacky.
Ofc könnte man argumentieren, dass die Eröffnung der Details Aktivität und Verbreitung der gerade getrennt sein sollte, aber ich frage mich, ob jemand eine bessere Umsetzung/Vorschlag hat.