2

Ich verwende die neue Auslagerungsbibliothek für meine Daten. Alles funktioniert gut, wenn das ViewModel erstellt wird und Live-Daten zuerst initialisiert werden. Problem ist, dass ich den Wert meiner Live-Daten nicht aktualisieren kann, wenn ich beispielsweise auf Menüpunkt klicke und diese mit einem anderen Datensatz aktualisieren möchte. Dann wird onChanged-Methode in meinem Fragment nicht aufgerufen. Ich habe über MutableLiveData und Methoden wie setValue und postValue gelesen, die die Live-Daten aktualisieren können, aber in meinem Fall verwende ich LivePagedListProvider und kann MutableLiveData nicht aus einer Datenbank zurückgeben.Wie LiveData-Wert zu aktualisieren?

Dao:

@Query("SELECT * FROM teams ORDER BY name ASC") 
LivePagedListProvider<Integer, Team> getAllTeams(); 

Fragment:

mTeamViewModel.mTeamsList.observe(this, new Observer<PagedList<Team>>() { 
     @Override 
     public void onChanged(@Nullable PagedList<Team> teams) { 
      mTeamAdapter.setList(teams); 
     } 
}); 

Ansichtsmodell:

public LiveData<PagedList<Team>> mTeamsList; 

@Inject 
DatabaseManager mDatabaseManager; 

void setTeamViewModel(final DatabaseManager databaseManager) { 
    mDatabaseManager = databaseManager; 

    mTeamsList = mDatabaseManager.getAllTeams().create(
      0, 
      new PagedList.Config.Builder() 
        .setPageSize(50) 
        .setPrefetchDistance(50) 
        .setEnablePlaceholders(true) 
        .build()); 

} 

boolean onOptionsItemSelected(final MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.action_favorite: 
      mTeamsList = mDatabaseManager.getFavoriteTeams().create(
        0, 
        new PagedList.Config.Builder() 
          .setPageSize(50) 
          .setPrefetchDistance(50) 
          .build()); 
      return true; 
     default: return false; 
    } 
} 
+0

@Update annotierte Methode macht einen Trick (oder Einfügen oder Löschen) – pskink

+0

Meinen Sie, etwas in meiner Tabelle zu aktualisieren, einzufügen oder zu löschen, damit es onChanged auslöst? Das könnte funktionieren, aber was soll ich aktualisieren? – tomas

+0

Sie sollten den Datensatz, den Sie ändern möchten, aktualisieren, aber für Lernzwecke einfach neuen Datensatz einfügen - es ist viel einfacher – pskink

Antwort

1

erstellen isFavourite Spalte in Ihrem Modell. Dann:

@Query("SELECT * FROM teams WHERE isFavourite = true") 
LivePagedListProvider<Integer, Team> getFavouriteTeams(); 

Dann sollten Sie ViewModel mit einer Funktion/Feld haben, die ein MutableLiveData<PagedList<Team>> zurückgibt und in den Fragment/Activity Sie zu diesem Bereich beobachten. In Ihrem /Activity teilen Sie dem ViewModel jede Änderung mit, die Sie tun müssen, um die Liste zu zeigen. Dann ordnen Sie in der ViewModel der Livedatenliste verschiedene Werte zu.

+0

Aber ich möchte nicht nur zwei Listen anzeigen. In der Tat habe ich 5 verschiedene Optionen, um eine Liste basierend auf der Kategorie anzuzeigen. Also denke ich, dass es nicht die beste Option ist, einen Adapter für jeden von ihnen zu erstellen. Stattdessen funktioniert es für mich nur mit verschiedenen Beobachtern, aber einem Adapter. Was auch funktioniert, ist das Entfernen und Einstellen eines Beobachters, wenn ich auf eine meiner Kategorien klicke. Denken Sie, dass dieser Ansatz gut ist? – tomas

+0

Überprüfen Sie meine Bearbeitung! :) –