Обновление MutableLiveData списка элементов

Я использую LiveData и ViewModel из компонентов архитектуры в моем приложении.

У меня есть список элементов, разбитых на страницы, я загружаю больше, когда пользователь прокручивает страницу вниз. Результат запроса сохраняется в

MutableLiveData<List<SearchResult>>

Когда я выполняю начальную загрузку и устанавливаю переменную в новый список, он запускает обратный вызов адаптера привязки, который загружает данные в recyclerview.

Однако, когда я загружаю вторую страницу и добавляю в список дополнительные элементы, обратный вызов не запускается. Однако, если я заменяю список новым списком, содержащим как старые, так и новые элементы, срабатывает обратный вызов.

Возможно ли, чтобы LiveData уведомляла своих наблюдателей об обновлении списка поддержки, а не только при обновлении объекта LiveData?

Это не работает (игнорируя нулевые проверки):

val results = MutableLiveData<MutableList<SearchResult>>()

/* later */

results.value.addAll(newResults)

Это работает:

val results = MutableLiveData<MutableList<SearchResult>>()

/* later */

val list = mutableListOf<SearchResult>()
list.addAll(results.value)
list.addAll(newResults)
results.value = list

person Francesc    schedule 12.03.2018    source источник
comment
Единственный известный мне способ - настроить весь список так, чтобы вы уведомляли наблюдателей. Более интересный трюк можно найти здесь: stackoverflow.com/questions/48020377/   -  person woodii    schedule 13.03.2018
comment
Спасибо, это в основном обходной путь, но я попробую.   -  person Francesc    schedule 13.03.2018


Ответы (2)


Думаю, расширение получше.

operator fun <T> MutableLiveData<ArrayList<T>>.plusAssign(values: List<T>) {
    val value = this.value ?: arrayListOf()
    value.addAll(values)
    this.value = value
}

Использование:

list += anotherList;
person Samnang CHEA    schedule 26.05.2018

Согласно MutableLiveData, вам необходимо использовать postValue или setValue, чтобы вызвать наблюдателей.

person Shynline    schedule 05.07.2018
comment
Он использует Котлин. results.value равно results.setValue() - person Mou; 19.10.2018