notifyItemInserted 再次渲染整个列表
notifyItemInserted renders the entire list again
我有以下方法 -
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
为什么会这样,我错过了什么?
notifyItemRangeChanged
的秒参数将计数作为值,因此由于更改项的值始终为 1,因此传递 1
而不是 messagesList.size
作为:
conversationAdapter.notifyItemRangeChanged(messagesList.size - 1, 1)
此外, 可以是可变的,它可以跟踪可用于 notifyItemRangeChanged
的已更改项目的数量,当您将有不止一项要更新时。
我有以下方法 -
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
为什么会这样,我错过了什么?
notifyItemRangeChanged
的秒参数将计数作为值,因此由于更改项的值始终为 1,因此传递 1
而不是 messagesList.size
作为:
conversationAdapter.notifyItemRangeChanged(messagesList.size - 1, 1)
此外,notifyItemRangeChanged
的已更改项目的数量,当您将有不止一项要更新时。