Я использую 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
34
Francesc 13 Мар 2018 в 02:59

2 ответа

Лучший ответ

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

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

Применение:

list += anotherList;
19
Samnang CHEA 17 Окт 2018 в 09:12

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

7
Alexander Pacha 8 Янв 2020 в 13:22