Android - LiveData не обновляется

В моем фрагменте я наблюдаю поле dbQuestionsList:

viewModel.dbQuestionsList.observe(viewLifecycleOwner, Observer { list ->
            Log.i("a", "dbQuestionsList inside fragment = $list ")
        })

В моем фрагменте у меня есть несколько кнопок, и в зависимости от того, какая из них нажата, я вызываю метод viewModel, передавая строку, которая была установлена ​​как тег для кнопки.

viewModel.onFilterChanged(button.tag as String)

Мой режим просмотра:

   lateinit var dbQuestionsList: LiveData<List<DatabaseQuestion>>
   init{
    onFilterChanged("") 
   }
   private fun onFilterChanged(filter: String) {
                dbQuestionsList = mRepository.getDbQuestionsForCategory(filter)
   }

Репозиторий:

fun getDbQuestionsForCategory(categoryName: String): LiveData<List<DatabaseQuestion>> {
        return database.dbQuestionsDao().getDbQuestionsByCategory(categoryName)
    }

Дао метод:

@Query("SELECT * FROM db_questions_database WHERE category = :categoryId")
    fun getDbQuestionsByCategory(categoryId: String): LiveData<List<DatabaseQuestion>>

Когда я нажимаю кнопку, вызывается метод viewModel с аргументом, который следует использовать для обновления LiveData путем поиска в базе данных комнаты, но НИЧЕГО не обновляется без причины. База данных не пуста, поэтому нет причин возвращать null и не запускать наблюдателя в основном фрагменте. Но когда я делаю это в своей viewModel:

lateinit var dbQuestionsList: LiveData<List<DatabaseQuestion>>
       init{
        onFilterChanged("travel") 
       }

где я жестко запрограммировал параметр, комната вернет список, и будет запущен наблюдатель во фрагменте, поэтому он работает так, но не работает, когда аргументы передаются при нажатии кнопки. Пожалуйста, объясните, потому что это не имеет смысла. Я пробовал использовать изменяемые живые данные с использованием .setValue и .postValue, но НИЧЕГО не работает.




Ответы (2)


Причина, по которой вы не получаете обновления, заключается в том, что onFilterChanged() переназначает dbQuestionsList, а не обновляет его. Таким образом, переменная, которую вы наблюдаете изначально, на самом деле никогда не изменяется.

Я бы, вероятно, реализовал это с помощью преобразования:

val filter = MutableLiveData<String>().apply { value = "" }
val dbQuestionsList = Transformations.switchMap(filter) {
    mRepository.getDbQuestionsForCategory(filter)
}

Затем в вашем фрагменте просто установите фильтр при нажатии кнопки:

viewModel.filter.value = button.tag as String
person alexc    schedule 30.08.2019

Попробуй это:

dbQuestionsList.value = mRepository.getDbQuestionsForCategory(filter)

or

 dbQuestionsList.postValue(mRepository.getDbQuestionsForCategory(filter))
person Shermano    schedule 30.08.2019
comment
Я не могу попробовать их, потому что .getDbQUestionsForCategory возвращает данные в реальном времени, но я пробовал это: dbQuestionsList.value = mRepository.getDbQuestionsForCategory (filter) .value, и он не работает, то же самое с postValue - person Alen; 31.08.2019