DiffUtil.Callback无法按预期工作

时间:2019-06-17 09:39:01

标签: android android-recyclerview android-diffutils android-listadapter

我正在使用DiffUtil.ItemCallback和ListAdapter来更新RecyclerView。

它运作良好,但是有些行为困扰我。

根据文档,仅当areContentsTheSame返回areItemsTheSame时,才应调用true方法。

从文档中:

  

仅当areItemsTheSame(int,int)对这些项目返回true时,才调用此方法。

但是,在我的情况下,用新列表更新列表,例如:

adapter.submitList(items.toMutableList())

DiffUtil.ItemCallback确实触发了,但是即使areItemsTheSame返回true时,它也不会立即调用areContentTheSame(如预期的那样),而是areItemsTheSame一次又一次地调用在不同的对象对上(我在其中使用了带有断点的调试器)。 在areItemsTheSame调用几次并返回true之后,最后它确实调用了areContentTheSame,有时,我看到传递到areContentTheSame的对象实际上是不一样的!并有不同的ID!这意味着areContentTheSame甚至都不应该在这些对上调用!!

这是实现DiffUtilCallback的方式:

class AppDiffCallback : DiffUtil.ItemCallback<Item?>() {

override fun areItemsTheSame(oldItem: Item, newItem: Item): Boolean {
    Timber.i("areItemsTheSame: called..")
    if (oldItem.getItemType() == newItem.getItemType()) {
        Timber.i("areItemsTheSame: done true..")
        return true
    }
    Timber.w("areItemsTheSame: done false..")
    return false
}

override fun areContentsTheSame(oldItem: Item, newItem: Item): Boolean {
    Timber.i("areContentsTheSame: called")
    if(oldItem.getItemType() != newItem.getItemType()){
        Timber.w("areContentsTheSame: itemsNotTheSame WTF???}")
        return false
    }

    return when (oldItem.getItemType()) {
        Item.HEADER -> checkHeaderContent(oldItem = oldItem as ItemHeader, newItem = newItem as ItemHeader)
        Item.ITEM_ACTION -> checkItemContent(oldItem = oldItem as ItemAction, newItem = newItem as ItemAction)
        else -> false
    }
}

   private fun checkHeaderContent(oldItem: ItemHeader, newItem: 
     ItemHeader): Boolean {
         val itemContentTheSame = oldItem.date.toDate().time == 
         newItem.date.toDate().time
         return itemContentTheSame
   }

   private fun checkItemContent(oldItem: ItemAction, newItem: ItemAction): Boolean {
        val itemContentTheSame = oldItem.action == newItem.action
        return itemContentTheSame
   }
}

此外,在运行此命令时,在日志猫中,我看到使用areItemsTheSametrue的许多调用,但很少看到areContentTheSame

这是预期的行为吗?

0 个答案:

没有答案