首页 > 解决方案 > 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;
}

标签: javaandroidmvvmretrofit

解决方案


在函数 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
})

推荐阅读