Android - 向MutableLiveData添加新项并观察

4

我如何将新项目添加到MutableLiveData列表中? 我想构建一个无限滚动的Recyclerview。 因此,我有一个包含10个项目的列表,并且在单击“加载更多”按钮后,我想添加另外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,它会触发Activity中的observe方法。但是,如果我调用addAlladd,观察者方法不会被调用。

这个回答解决了你的问题吗?当LiveData列表中添加项目时通知观察者 - Valeriy Katkov
我认为这不正确。他们说要使用addAll并将列表设置为新列表。我只想添加新项目,而不是添加完整的列表/覆盖现有的列表,因为我通过Adapter进行更改,如果我添加完整的新列表,它将被删除。 - Torben G
这是更新RecycleView的常规方式。我已经添加了一个更详细的答案,希望它能帮到你。 - Valeriy Katkov
3个回答

3

实际上,这是您应该如何更新适配器:

  1. 向现有列表添加新项目。
  2. 通过将相同的列表分配给其值来通知 LiveData。 此处 是带有解决方案的相同问题。
  3. 当 Activity 收到列表已更改的通知时,应通过调用其 notifyDataSetChanged() 方法来通知适配器进行更改。

当您调用适配器的 notifyDataSetChanged() 方法时,它会比较先前的项目与新项,找出哪些已更改并更新 RecyclerView。您可以通过调用 notifyItemRangeInserted() 而不是 notifyDataSetChanged() 来帮助适配器。在您的情况下,notifyItemRangeInserted() 接受一个插入项目的范围,您可以通过将 adapter.itemCountproductList.size 的差异计算得出。


啊,是的,你说得对。抱歉,我不知道适配器这么聪明,它可以找出哪些被更改了。非常感谢。 - Torben G

1
MutableLiveData.postValue(T value):在后台线程中设置LiveData的值。

0

我曾经遇到过同样的问题。我将LiveData的数据复制到新的List中,然后将new data添加到new List中。最后将new List赋值给LiveData。我知道这不是完美的解决方案,但它解决了问题。

你可以试试这个方法。

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

希望这能对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接