如何更新LiveData值?

时间:2017-11-16 16:49:11

标签: android android-architecture-components android-livedata android-paging

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

道:

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

片段:

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

视图模型:

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;
    }
}

3 个答案:

答案 0 :(得分: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;

}

有关MediatorLiveData

的详细信息,请参见here

答案 1 :(得分:2)

在模型中创建isFavourite列。然后:

@Query("SELECT * FROM teams WHERE isFavourite = true")
LivePagedListProvider<Integer, Team> getFavouriteTeams();

然后你应该有一个ViewModel,其函数/字段会返回MutableLiveData<PagedList<Team>>,并且会在Fragment / Activity中找到该字段。在Fragment / Activity中,您告诉ViewModel您需要做的每项更改才能显示清单。然后在ViewModel中为实时数据列表分配不同的值。

答案 2 :(得分:0)

Transformations.switchMap可以帮助:https://developer.android.com/reference/android/arch/lifecycle/Transformations#switchmap

class SearchViewModel() : ViewModel(){

val teamId = MutableLiveData<Int>()

var teamsList: LiveData<PagedList<Team>>=
    Transformations.switchMap(teamId) { id ->
        //just example
        if (id <= 0) {
            //1
            searchDbManager.searchWithoutId()
        } else {
            //2
            anotherSearchDbManager.searchWithId(id)
        }.setBoundaryCallback(SearchResultBoundaryCallback()).build()
    }
}

fun changeTeamId(id : Int){
   teamId.postValue(id)
}

如果要更改搜索过程以使用团队ID进行搜索(或切换到另一个数据源),只需从Fragment调用:

viewModel.changeTeamId(2)