首页 > 解决方案 > 是否可以使用嵌套数组列表进行 DiffUtil.Callback

问题描述

我对 Android 中的 DiffUtil.Callback 类有疑问,该类用于有效计算两个列表之间的差异。它通常与 RecyclerView 结合使用。在我找到的所有示例中,他们使用的列表如下

ArrayList<CustomObject> newList;
ArrayList<CustomObject> oldList;

// the other methods that need to be overridden
// e.g. getOldListSize(), getNewListSize() etc.

我的问题是:是否可以使用如下列表编写 DiffUtil.Callback ...

ArrayList<ArrayList<CustomObject>> oldList;
ArrayList<ArrayList<CustomObject>> newList;

有可能吗?如果没有,为什么不呢。如果是,扩展 DiffUtil.Callback 的类会是什么样子?

标签: javaandroid

解决方案


您必须在 areItemsTheSame 和 areContentsTheSame 方法中迭代嵌套列表。如果任何项目已更改,则返回 false。

class FilterDiffUtilCallback : DiffUtil.ItemCallback<FilterUIModel>() {
    override fun areItemsTheSame(oldItem: FilterUIModel, newItem: FilterUIModel): Boolean {
        return oldItem.name == newItem.name
    }

    override fun areContentsTheSame(oldItem: FilterUIModel, newItem: FilterUIModel): Boolean {
        val size = oldItem.filterDataUiModel?.size ?: 0
        for (index in 0 until size) {
            if(oldItem.filterDataUiModel?.get(index) != newItem.filterDataUiModel?.get(index))
            {
                return false
            }
        }
        return oldItem == newItem
    }
}

推荐阅读