【问题标题】:Recyclerview data is changed without specify itRecyclerview 数据在未指定的情况下被更改
【发布时间】:2020-07-10 23:10:34
【问题描述】:

我正在我的模型列表中执行一些操作,然后传递给回收器适配器并更新适配器列表。由于某些意外原因,适配器列表在我通过新列表之前已更新。我正在使用 DiffUtil 计算 oldList 和 newList 之间的差异。

internal fun CheckoutDetailsActivity.updateLineItemWithPartialPayment(lineItemModelToUpdate: LineItemModel){

    GlobalScope.launch {
        withContext(Dispatchers.Main) {
            calculateTodayPayments(lineItemModelToUpdate)
        }
    }
}

internal suspend fun  CheckoutDetailsActivity.calculateTodayPayments(lineItemModelToUpdate: LineItemModel){
    var todayPayments: BigDecimal = BigDecimal.ZERO
    val lineItems: ArrayList<LineItemModel> = ArrayList(viewModel.ticket?.lineItems)

    withContext(Dispatchers.Default){
        lineItems.forEachIndexed loop@{ index, lineItemModel ->
            if(lineItemModel.id == lineItemModelToUpdate.id){
                lineItems[index] = lineItemModelToUpdate
                todayPayments += lineItemModelToUpdate.partialPaymentAmount?: BigDecimal.ZERO
                return@loop
            }
            lineItemModel.inPartialPayment = true
            todayPayments += lineItemModel.partialPaymentAmount?: BigDecimal.ZERO
        }
    }

    viewModel.todayPayments = todayPayments

    updateRecyclerAdapter(lineItems)
    showTodayPaymentContainer()
}

internal fun CheckoutDetailsActivity.updateRecyclerAdapter(lineItems: ArrayList<LineItemModel>){
    viewModel.lineItemsWithPartialPayment.clear()
    viewModel.lineItemsWithPartialPayment.addAll(lineItems)
viewModel.recyclerViewAdapter?.submitList(viewModel.sortLineItems(ArrayList(lineItems)))
    viewModel.ticket?.lineItems = lineItems
}

这是我在适配器中的 submitList() 函数:

 fun submitList(lineItemList: List<LineItemModel>){
        val oldLineItemList = lineItems
        val diffResult: DiffUtil.DiffResult = DiffUtil.calculateDiff(
            LineItemDiffCallback(
                oldLineItemList,
                lineItemList
            )
        )
        this.lineItems.clear()
        this.lineItems.addAll(lineItemList)
        diffResult.dispatchUpdatesTo(this)
    }

    class LineItemDiffCallback(
        var oldLineItemList: List<LineItemModel>,
        var newLineItemList: List<LineItemModel>
    ): DiffUtil.Callback(){
        override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
            return oldLineItemList[oldItemPosition].id == newLineItemList[newItemPosition].id
        }

        override fun getOldListSize(): Int {
           return oldLineItemList.size
        }

        override fun getNewListSize(): Int {
           return newLineItemList.size
        }

        override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
            return oldLineItemList[oldItemPosition] == newLineItemList[newItemPosition]
        }

    }

在最后一种方法中,我使用 submitList() 更新适配器列表,当我检查 viewModel.todayPayments = todayPayments 行中的适配器列表时,它已经使用之前的操作“forEachIndexed()”更新,因此 DiffUtil 无法正常工作,因为它无法找到 oldListnewList 之间的区别。

【问题讨论】:

    标签: android android-recyclerview android-diffutils


    【解决方案1】:

    updateLineItemWithPartialPayment 调用 calculateTodayPayments 调用 updateRecyclerAdapter 调用 updateLineItemWithPartialPayment 调用 calculateTodayPayments 调用 updateRecyclerAdapter [...] 你明白了...

    为什么要使用扩展函数?您不是从活动本身调用它们吗?

    另一件事...submitList 是你的函数还是你使用的是 PagedListAdapter?

    【讨论】:

    • 哦,抱歉,我创建问题时出错,但现在已更新。
    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    相关资源
    最近更新 更多