【问题标题】:notifyItemInserted renders the entire list againnotifyItemInserted 再次渲染整个列表
【发布时间】:2020-04-22 15:29:31
【问题描述】:

我有以下方法——

  private fun initRoomObserving() {
        dashboardViewModel = ViewModelProvider(this).get(DashboardViewModel::class.java)
        dashboardViewModel.getAllMessagesEntities().observe(this, Observer { receivedMessageList ->
            receivedMessageList.forEach {
                if (!userPhoneNumber.equals(it.senderUsername)) {
                    it.isReceiver = true
                }
                if (!messagesList.contains(it)) {
                    messagesList.add(it)
                }
            }
            conversationAdapter.notifyItemInserted(messagesList.size)
            conversationAdapter.notifyItemRangeChanged(messagesList.size - 1,messagesList.size)

        })
    }

由于某种原因,每次添加新实体时都会重新呈现整个列表,即使我明确地是 notifyItemInserted 而不是 notifyDataSetChanged

为什么会发生这种情况,我错过了什么?

【问题讨论】:

  • 试试conversationAdapter.notifyItemRangeChanged(messagesList.size - 1,/*numberOfNewItems*/ someCount)
  • 新项目数总是1,什么是'some count'?
  • 那么someCount 应该是1
  • 已解决,请评论,我会批准

标签: android android-recyclerview notifydatasetchanged


【解决方案1】:

notifyItemRangeChanged 的 seconds 参数将计数作为值,因此由于更改项的值始终为 1,因此传递 1 而不是 messagesList.size 为:

conversationAdapter.notifyItemRangeChanged(messagesList.size - 1, 1)

此外,someCount 可以是变量,当您有超过一项要更新时,它可以跟踪可用于notifyItemRangeChanged 的更改项的数量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-15
    • 2013-02-17
    • 2020-11-15
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 2020-10-30
    • 2022-08-18
    相关资源
    最近更新 更多