在AndroidViewModel中初始化LiveData

Ved*_*wal 10 android android-livedata android-architecture-components

我正在寻找一种方法来初始化ViewModel中的LiveData对象.当前只有在从活动调用setQuery方法时才会初始化项目.

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);
}
Run Code Online (Sandbox Code Playgroud)

}

adi*_*e49 6

根据转换文档,您必须至少调用 setQuery(String queryText) 一次

除非观察者正在观察返回的LiveData对象,否则不会计算转换.由于转换是延迟计算的,因此生命周期相关的行为会被隐式传递下去,而不需要额外的显式调用或依赖项.

因此,如果您不setQuery(String queryText)从Activity 调用它将不会更新MutableLiveData<String> query,也不会触发转换.

如果你想避免来自Activity的初始调用你可以在Transformation初始化之下调用它,就像这样,

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("")
}
Run Code Online (Sandbox Code Playgroud)

它将触发空搜索部分并返回所有项目.

您还需要观察案例中返回的数据items.如果没有观察者正在观察数据,则不会触发交易.

正如我在文档和少数博客中提到的,这对我有用