如何更新LiveData值?

tom*_*mas 4 android android-livedata android-architecture-components android-paging

我正在为我的数据使用新的分页库.创建ViewModel并首次初始化实时数据时,一切正常.问题是,当我点击菜单项并希望用不同的数据集更新时,我无法更新我的实时数据的值.然后我的片段中的onChanged方法不会被调用.我已经阅读了有关MutableLiveData和setValue和postValue等可以更新实时数据的方法,但在我的情况下,我使用的是LivePagedListProvider并且无法从数据库返回MutableLiveData.

道:

@Query("SELECT * FROM teams ORDER BY name ASC")
LivePagedListProvider<Integer, Team> getAllTeams();
Run Code Online (Sandbox Code Playgroud)

分段:

mTeamViewModel.mTeamsList.observe(this, new Observer<PagedList<Team>>() {
        @Override
        public void onChanged(@Nullable PagedList<Team> teams) {
            mTeamAdapter.setList(teams);
        }
});
Run Code Online (Sandbox Code Playgroud)

视图模型:

public LiveData<PagedList<Team>> mTeamsList;

@Inject
DatabaseManager mDatabaseManager;

void setTeamViewModel(final DatabaseManager databaseManager) {
    mDatabaseManager = databaseManager;

    mTeamsList = mDatabaseManager.getAllTeams().create(
            0,
            new PagedList.Config.Builder()
                    .setPageSize(50)
                    .setPrefetchDistance(50)
                    .setEnablePlaceholders(true)
                    .build());

}

boolean onOptionsItemSelected(final MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_favorite:
            mTeamsList = mDatabaseManager.getFavoriteTeams().create(
                    0,
                    new PagedList.Config.Builder()
                            .setPageSize(50)
                            .setPrefetchDistance(50)
                            .build());
            return true;
        default: return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

Anu*_*are 6

最后我在3天的斗争后找到了解决方案,

要更新LiveData的值,我们可以在ViewModel中使用MediatorLiveData,如下所示 -

    public LiveData<PagedList<RecipeListPojo>> liveData;
    private MediatorLiveData<PagedList<RecipeListPojo>> mediatorLiveData;
     public RecipeListViewModel(@NonNull Application application) {
    super(application);
    mediatorLiveData=new MediatorLiveData<>();

}

    public MediatorLiveData<PagedList<RecipeListPojo>> init(RecipeDao recipeDao,RecipeFrom recipeFrom,String orderBy) {
    liveData = new LivePagedListBuilder(recipeDao.getAllRecipesList(simpleSQLiteQuery), 6).build();
        mediatorLiveData.addSource(liveData, new Observer<PagedList<RecipeListPojo>>() {
            @Override
            public void onChanged(@Nullable PagedList<RecipeListPojo> recipeListPojos) {
                mediatorLiveData.setValue(recipeListPojos);
            }
        });
    return mediatorLiveData;

}
Run Code Online (Sandbox Code Playgroud)

有关MediatorLiveData的更多详细信息,请参见此处