我只是想学习 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
})
-
response.body()
将提供类APIResponse。但是您需要作为响应的是列表。 若要将预期的响应作为 List,请尝试response.body().getMetadata().getResults()
-
它也可以是存储库初始化。尝试创建
public void init() { mRepository = Repository.getInstance(); liveData = mRepository.getData(); }
使用viewModel.init();
- 模型
- 类属性应与响应 JSON 字段匹配,以便从响应中获取模型对象。
在 response.body(( 上调试并查看数据。 如果模型为空,则字段不匹配。