1

Ich suche nach einer Möglichkeit, das LiveData-Objekt innerhalb des ViewModel zu initialisieren. Elemente werden derzeit nur initialisiert, wenn die setQuery-Methode aus der Aktivität aufgerufen wird.Initialisiere LiveData In AndroidViewModel

public class MyListViewModel extends AndroidViewModel { 

private final LiveData <List<Item>> items; 
private final MutableLiveData<String> query = new MutableLiveData<>(); 


private MyDatabase db; 

public MyListViewModel(Application application) { 
    super(application); 
    db = MyDatabase.getInstance(application); 
    items = Transformations.switchMap(query, (search)->{ 
     if (search == null || search.trim().length() == 0) { 
      return db.itemDao().getAllItems(); 
     } else { 
      return db.itemDao().findItemsBySearchTerm(search); 
     } 
    }); 

} 

public LiveData<List<Item>> getItems() { 
    return items; 
} 

public void setQuery(String queryText) { 
    query.setValue(queryText); 
} 

}

+0

versuchen, die 'setQuery Aufruf („“)' unter Artikel Transformation Initialisierung, so dass Sie ersten Aufruf von Aktivität vermeiden können – adityakamble49

Antwort

2

Sie müssen AnrufsetQuery(String queryText)mindestens einmal Wie pro Transformation Dokumentation

Die Transformationen nicht es sei denn, ein Beobachter beobachtet das zurück berechnet werden LiveData-Objekt. Da die Transformationen faul berechnet werden, wird das liquiditätsbezogene Verhalten implizit übergeben, ohne dass zusätzliche explizite Aufrufe oder Abhängigkeiten erforderlich sind.

So dass, wenn Sie nicht setQuery(String queryText) von Aktivität rufen Sie werden es nicht MutableLiveData<String> query aktualisieren und wird die Transformation nicht auslösen.

Wenn Sie ersten Aufruf von Aktivität vermeiden möchten, können Sie es unter der Transformation Initialisierung wie folgt aufrufen,

public MyListViewModel(Application application) { 
    super(application); 
    db = MyDatabase.getInstance(application); 
    items = Transformations.switchMap(query, (search)->{ 
     if (search == null || search.trim().length() == 0) { 
      return db.itemDao().getAllItems(); 
     } else { 
      return db.itemDao().findItemsBySearchTerm(search); 
     } 
    }); 
    setQuery("") 
} 

Es wird die leere Suchteil auslösen und Alle Artikel zurück.

Auch müssen Sie die zurückgegebenen Daten in Ihrem Fall items. Wenn kein Beobachter die Daten beobachtet, wird die Transaktion nicht ausgelöst.

Wie ich genannt von Documentation und einige Blogs dies funktionierte für mich