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
})
  1. response.body()将提供类APIResponse。但是您需要作为响应的是列表。 若要将预期的响应作为 List,请尝试response.body().getMetadata().getResults()

  2. 它也可以是存储库初始化。尝试创建

    public void init() {
    mRepository = Repository.getInstance();
    liveData = mRepository.getData();
    }
    

使用viewModel.init();

    模型
  1. 类属性应与响应 JSON 字段匹配,以便从响应中获取模型对象。

在 response.body(( 上调试并查看数据。 如果模型为空,则字段不匹配。

最新更新