Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在AndroidViewModel中初始化LiveData_Android_Android Architecture Components_Android Livedata - Fatal编程技术网

在AndroidViewModel中初始化LiveData

在AndroidViewModel中初始化LiveData,android,android-architecture-components,android-livedata,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<

我正在寻找一种在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);
}
公共类MyListViewModel扩展了AndroidViewModel{
私有最终实时数据项;
private final MutableLiveData query=new MutableLiveData();
私有数据库;
公共MyListViewModel(应用程序){
超级(应用);
db=MyDatabase.getInstance(应用程序);
items=Transformations.switchMap(查询,(搜索)->{
if(search==null | | search.trim().length()==0){
返回db.itemDao().getAllItems();
}否则{
返回db.itemDao();
}
});
}
公共LiveData getItems(){
退货项目;
}
公共void setQuery(字符串queryText){
query.setValue(queryText);
}

}您必须调用
设置查询(字符串查询文本)
至少一次 根据转换文档

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

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

如果要避免活动的初始调用,可以在转换初始化下面这样调用它

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 transformation initialization下面的
setQuery(“”
),这样可以避免来自Activity的初始调用这对你有效吗?似乎没有其他答案,因此您可以批准此答案:)