web-dev-qa-db-fra.com

Initialiser LiveData dans AndroidViewModel

Je cherche un moyen d'initialiser l'objet LiveData à l'intérieur du ViewModel. Les éléments ne sont actuellement initialisés que lorsque la méthode setQuery est appelée à partir de l'activité.

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);
}

}

11
Ved Agarwal

Vous devez appeler setQuery(String queryText) au moins une fois Selon la documentation de transformation

Les transformations ne sont pas calculées sauf si un observateur observe l'objet LiveData renvoyé. Étant donné que les transformations sont calculées paresseusement , le comportement lié au cycle de vie est implicitement transmis sans nécessiter d'appels explicites ou de dépendances supplémentaires.

Ainsi, si vous n'appelez pas setQuery(String queryText) à partir d'Activité, il ne mettra pas à jour MutableLiveData<String> query et ne déclenchera pas la transformation.

Si vous voulez éviter l'appel initial de Activity, vous pouvez l'appeler sous l'initialisation de la transformation comme ceci,

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("")
}

Il déclenchera la recherche vide et renverra Tous les éléments .

Vous devez également observer les données retournées dans votre cas items. Si aucun observateur n'observe les données, la transaction ne se déclenchera pas.

Comme je l'ai mentionné depuis Documentation et quelques blogs, cela a fonctionné pour moi

6
adityakamble49