2017-06-03 4 views
0

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.

Antwort

0

Also nach ziemlich viel Forschung und Kontakt mit einem Google-Entwickler. Die empfohlene Lösung ist getrennte Zuständigkeiten.

eine Aktivität öffnen sollte die Antwort auf das Click-Ereignis und nicht die tatsächliche Änderung, diese Art von selectedItem Szenarien speziell für entkoppelt Kommunikation anderen hören Ansichten nützlich ist.

z.B ein anderes Fragment in der gleichen Aktivität

Verwandte Themen