调用MutableLiveData Web服务代理以更新列表

时间:2019-09-10 13:38:24

标签: android mvvm viewmodel android-livedata mutablelivedata

我在项目中使用MVVM结构。 如代码所示,我的主要片段带有list观察到的Web服务

片段:

mViewModel.getHomePageList().observe(this, homeDataWrapper -> {
           if (homeDataWrapper!=null) {
               if (homeDataWrapper.isStatus()) {
                   binding.homeProgressBar.setVisibility(View.INVISIBLE);
                   ToastUtil.showTosat(homeDataWrapper.getData().getMessage(), getContext());
                   Log.d(TAG, "onChanged: ");
               }
           }
       });

视图模型:

ublic class HomePageViewModel extends AndroidViewModel {
    private MutableLiveData<DataWrapper<Home>> data;
    public ObservableInt loading;
    private HomeRepository homeRepository;
    private HomePageAdapter adapter;

    public HomePageViewModel(@NonNull Application application) {
        super(application);
    }

    public void init() {
        adapter = new HomePageAdapter(R.layout.main_page_list, this);
        homeRepository = new HomeRepository();
        if (this.data != null) {
            // ViewModel is created per Fragment so
            // we know the userId won't change
            return;
        }
        data = homeRepository.getHomeScreen();

    }


    public HomePageAdapter getAdapter() {
        return adapter;
    }

    public void onItemClick(Integer index) {

    }

    public void onSerachClicked(View view) {
        Navigation.findNavController(view).navigate(R.id.action_homePageFragment_to_searchActivity);
    }



    public MutableLiveData<DataWrapper<Home>> getHomePageList() {
        return this.data;
    }

}

HomeRepository:

public MutableLiveData<DataWrapper<Home>> getHomeScreen() {
    final MutableLiveData<DataWrapper<Home>> homeMutableLiveData = new MutableLiveData<>();
    final DataWrapper<Home> dataWrapper = new DataWrapper<>();
    RetrofitInstance.getApiService().getHome().enqueue(new Callback<Home>() {
        @Override
        public void onResponse(@NotNull Call<Home> call, @NotNull Response<Home> response) {
            Log.d("", "onResponse: " + response);
            if (response.code() == 200) {
                dataWrapper.setData(response.body());
                dataWrapper.setStatus(true);
                homeMutableLiveData.postValue(dataWrapper);
            }

        }

        @Override
        public void onFailure(Call<Home> call, Throwable t) {
            Log.d("", "onResponse: " + t);
            dataWrapper.setApiException((Exception) t);
            dataWrapper.setStatus(false);
            homeMutableLiveData.postValue(dataWrapper);
        }
    });

    return homeMutableLiveData;
}

我想添加SwipeRefreshLayout来更新主列表。再次调用Web服务并更新列表的正确方法是什么? 有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

在片段的onRefereshListener内部

swifeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            mViewModel.getHomeScreenDetail();
        }
    });

在Viewmodel中创建getHomeScreenDetail方法

public void getHomeScreenDetail(){
    data = homeRepository.getHomeScreen();
}

答案 1 :(得分:0)

您只需在存储库类中调用getHomeScreen即可再次触发从服务器中提取数据,完成提取请求后,将使用MutableLiveData通知观察者。

但这是您的问题,您每次调用MutableLiveData时都会创建一个新的getHomeScreen对象。因此,第一个不会被通知,列表也不会更新!

要解决此问题,您必须在其他地方初始化MutableLiveData,这样就不会在每次调用getHomeScreen时再次创建它。

我建议您将HomeRepository类设为单例类,并在构造函数中初始化MutableLiveData对象,然后从服务器获取新数据后,就可以使用该对象将数据发布给观察者。

public class HomeRepository {

    private static HomeRepository instance;
    private MutableLiveData<DataWrapper<Home>> homeMutableLiveData;

    public static HomeRepository getInstance() {
        if(instance == null) instance = new HomeRepository();
        return instance;
    }

    private HomeRepository() {
        homeMutableLiveData = new MutableLiveData<>();
    }

    public MutableLiveData<DataWrapper<Home>> getHomeScreen() {
        final DataWrapper<Home> dataWrapper = new DataWrapper<>();
        RetrofitInstance.getApiService().getHome().enqueue(new Callback<Home>() {
            @Override
            public void onResponse(@NotNull Call<Home> call, @NotNull Response<Home> response) {
                Log.d("", "onResponse: " + response);
                if (response.code() == 200) {
                    dataWrapper.setData(response.body());
                    dataWrapper.setStatus(true);
                   homeMutableLiveData.postValue(dataWrapper);
                }

            }

            @Override
            public void onFailure(Call<Home> call, Throwable t) {
                Log.d("", "onResponse: " + t);
                dataWrapper.setApiException((Exception) t);
                dataWrapper.setStatus(false);
                homeMutableLiveData.postValue(dataWrapper);
            }
        });

        return homeMutableLiveData;
    }

}