我正在寻找一种方法来初始化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);
}
}
你必须至少调用setQuery(String queryText)
一次根据转换文档
除非观察者正在观察返回的LiveData对象,否则不会计算转换。由于转换是延迟计算的,因此生命周期相关的行为会被隐式传递下去,而不需要额外的显式调用或依赖项。
因此,如果您不从Activity调用setQuery(String queryText)
,它将不会更新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("")
}
它将触发空搜索部分并返回所有项目。
您还需要观察items
案例中的返回数据。如果没有观察者正在观察数据,则不会触发交易。
正如我从Documentation和少数博客中提到的,这对我有用