在AndroidViewModel中初始化LiveData

时间:2017-12-31 16:43:32

标签: android android-architecture-components android-livedata

我正在寻找一种在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);
}

}

1 个答案:

答案 0 :(得分:5)

您必须致电 setQuery(String queryText) 至少一次 根据转换文档

  

除非观察者正在观察返回的LiveData对象,否则不会计算转换。   因为转换是 lazily 计算的,所以生命周期相关的行为会被隐式传递,而不需要额外的显式调用或依赖。

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

如果您想要避免来自Activity的初始调用,您可以在此类转换初始化之下调用它,

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中提到的,很少有博客这对我有用