java - MVVM - 响应列表不包含任何值
问题描述
我只是想学习 mvvm,但遇到了一些问题 - 我的列表应该包含来自 API 的响应是空的。我不确定为什么会这样。这是一些代码:
主要活动
mViewModel = new ViewModelProvider(this).get(ViewModel.class);
mViewModel.getData().observe(this, new Observer<List<Model>() {
@Override
public void onChanged(List<Model> list) {
if (data.size() > 0) {
data.clear();
}
if (list != null) {
data.addAll(list);
Log.i(TAG, "onChanged: " + data.size());
}
}
});
视图模型
private Repository mRepository;
private MutableLiveData<List<Model> liveData;
public ViewModel(@NonNull Application application) {
super(application);
mRepository = Repository.getInstance();
liveData = mRepository.getData();
}
public MutableLiveData<List<Model> getData(){
return liveData;
}
存储库
public MutableLiveData<List<Model>> getData(){
MutableLiveData<List<Model> mLiveData = new MutableLiveData<>();
mApiCall.callApi()
.enqueue(new Callback<List<Model>() {
@Override
public void onResponse(Call<List<Model> call, Response<List<Model> response) {
mLiveData.setValue(response.body());
}
@Override
public void onFailure(Call<List<Model> call, Throwable t) {
t.getMessage();
}
});
return mLiveData;
}
解决方案
在函数 getData() 中,您将返回实时数据,并在视图模型的这一行中:
liveData = mRepository.getData();
您将其分配给 liveDate 这是在您的视图模型中创建的可变实时数据,问题就在这里。当这个赋值发生时,视图模型中 liveData 变量中的观察者将被删除,这就是我们应该像这样使用 switchMap 的原因:
private var result : LiveData<List<Response>> = MutableLiveData()
result : LiveData<Response> = Transformations.map(mRepository.getData()){
it
}
现在您需要做的就是像这样在您的视图中观察 repo:
viewmodel.result.observe(this, Observer{ list ->
// to do with the result
})
推荐阅读
- java - 简单的android音频音序器实现
- java - 与 Java IDE 协作
- javascript - 如何在 React 中处理 3 级深度嵌套的多步表单?
- javascript - TypeError:person.map 不是函数
- google-colaboratory - IBM Cloud Watson (NLU) 情感服务错误
- python - 错误消息:无法从 'pylab 导入名称'hold'
- android - Android 芯片:如何更改文本垂直填充?
- c# - 当您拥有相关实体的 ID 时如何映射相关实体的属性
- vert.x - 如何更改 quarkus-vertx eventBus ClusterManager 选项
- android - 更新 gradle 错误我在添加库并更新时遇到问题