Android - Добавить новые элементы в MutableLiveData и наблюдать - PullRequest
0 голосов
/ 24 января 2020

Как я могу добавить новые элементы в список MutableLiveData? Я хочу построить бесконечную прокрутку Recyclerview. Итак, у меня есть список из 10 элементов, и после нажатия кнопки «загрузить еще» я хочу добавить десять новых элементов.

Это мои списки продуктов:

private companion object {
        private var _products = MutableLiveData<MutableList<Product>>()
    }

    val products: LiveData<MutableList<Product>> = _products

Муравей это моя функция загрузки:

fun loadProducts(category: Category) { // category: String
        _isViewLoading.postValue(true)


        AppService.fetchProducts(category, neuheitenCounter) { success, response ->
            _isViewLoading.postValue(false)
            if(success) {
                when(category) {
                    Category.NEWS -> {
                        if(_products.value == null) {
                            _products.value = response?.products //as List<Product>
                        } else {
                            response?.let {
                                _products.value?.addAll(response?.products)
                            }
                        }

                        neuheitenCounter++
                    }
                }
            }
        }
    }

Если я вызываю _products.value = response?.products, он запускает метод наблюдения в моя активность. Но если я вызываю addAll или add, метод наблюдателя не вызывается.

Ответы [ 2 ]

1 голос
/ 24 января 2020

Собственно, именно так вы должны обновить адаптер.

  1. Добавить новые элементы в существующий список
  2. Уведомить LiveData, присвоив этому списку тот же список. Здесь - такой же вопрос с решением.
  3. Когда ваша активность уведомляется об изменении списка, она должна уведомить адаптер об изменениях, вызвав его notifyDataSetChanged () * Метод 1011 *.

При вызове метода адаптера notifyDataSetChanged() он сравнивает предыдущие элементы с новыми, выясняет, какие из них изменены, и обновляет RecyclerView. Вы можете помочь адаптеру, вызвав notifyItemRangeInserted () вместо notifyDataSetChanged(). notifyItemRangeInserted() принимает диапазон для вставленных элементов, в вашем случае вы можете рассчитать его, но с учетом разницы между adapter.itemCount и productList.size.

0 голосов
/ 24 января 2020

У меня была та же проблема. Я скопировал данные LiveData в новый List, затем добавил new data к new List. И присвоил new List к LiveData. Я знаю, что это не точное РЕШЕНИЕ, но это решенная проблема.

Попробуйте это.

    var tempList= _products.value
    tempList.addAll(response?.products)
    _products.value = tempList

Надеюсь, это поможет вам.

...