【问题标题】:Android - Add new Items to MutableLiveData and observeAndroid - 向 MutableLiveData 添加新项目并观察
【发布时间】:2020-01-24 11:28:57
【问题描述】:

如何将新项目添加到 MutableLiveData 列表?我想构建一个无限滚动的 Recyclerview。所以我有一个包含 10 个项目的列表,在单击“加载更多按钮”后,我想添加 10 个新项目。

这是我的产品清单:

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

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

Ant 这是我的加载函数:

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,它会在我的活动中触发观察方法。但如果我调用addAlladd,则不会调用观察者方法。

【问题讨论】:

  • 我认为这是不正确的。他们说 addAll 并将列表设置为新列表。我只想添加新项目而不添加完整列表/覆盖现有列表,因为我通过适配器进行更改,如果我添加完整的新列表,它将被删除。
  • 这是更新 RecycleView 的常用方法。我添加了一个更详细的答案,希望对您有所帮助。

标签: android kotlin android-livedata


【解决方案1】:

其实应该是这样更新适配器的

  1. 将新项目添加到现有列表中
  2. 通过将相同的列表分配给 LiveData 的值来通知 LiveData。 Here 与解决方案是同一个问题。
  3. 当通知您的 Activity 列表已更改时,它应通过调用其 notifyDataSetChanged() 方法通知适配器有关更改。

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

【讨论】:

  • 啊,是的,你是对的。对不起。不知道适配器是如此智能,以至于它可以确定其中哪些被更改。非常感谢。
【解决方案2】:

我遇到了同样的问题。我在新的List 中复制了LiveData 的数据,然后我将new data 添加到new List。并将new List 分配给LiveData。我知道这不是确切的解决方案,但这个问题解决了。

试试这个。

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

希望对你有所帮助。

【讨论】:

    【解决方案3】:

    MutableLiveData.postValue(T 值)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-31
      • 1970-01-01
      相关资源
      最近更新 更多