通过更新变量来更改L iveData源

问题描述 投票:1回答:1

我希望LiveDataRecyclerView来源根据您选择的列表而改变。而且,如果您在此搜索中选择了一个来源。目前,我无法在两个来源之间来回切换。因此,我可以显示“房间”数据库中的项目,但是如果选择了另一个列表,则无法更改源。

示例:如果您选择列表2,则LiveData源将被更改,并且列表2中包含的所有项目都将显示。现在,您还应该可以在此列表中搜索单词2。如何在应用程序运行时执行此操作?

我当前Repository的一部分:

public LiveData<List<VocabularyEntity>> getVocabularies(int listNumber, String searchText) {
    if (listNumber == 0) {
        return listDao.getVocabularies(searchText);
    } else {
        return listDao.getVocabularyList(listNumber, searchText);
    }
}

以及我当前ViewModel的一部分:

public LiveData<List<ListEntity>> getLists() {
    return repository.getLists(listNumber, searchText);
}
java android data-binding android-room android-livedata
1个回答
0
投票

我没有看到实际上在您的setValue上正在调用的任何getValueLiveData函数。

为了更改LiveData以与实时更改进行交互,您需要在setValue对象中调用LiveData。我认为,类似以下内容应该可以解决您的问题。

// I am assuming you have this variable declared in your viewmodel
private LiveData<List<ListEntity>> vocabList;

public LiveData<List<ListEntity>> getLists() {
    List<ListEntity> vocabListFromDB = repository.getLists(listNumber, searchText);
    vocabList.setValue(vocabListFromDB);

    return vocabList;
}

并且您不必再从存储库函数中返回LiveData对象。

public List<VocabularyEntity> getVocabularies(int listNumber, String searchText) {
    if(listNumber == 0) {
        return listDao.getVocabularies(searchText);
    } else {
        return listDao.getVocabularyList(listNumber, searchText);
    }
}

我希望有帮助!

我想分享我对实际执行此操作的个人看法。我宁愿使用ContentObserver而不是LiveData设置。以我的拙见,用ContentObserverCursorLoader实施似乎是一个更简单,更强大的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.