0

我正在使用带有 Android 列表适配器的密封类,其中 2 个不同的对象合并到一个列表中。列表中的最后一项只是添加更多布局(如页眉)。我正在使用 DiffUtils 并注意到即使我将 newItem 转换为 Object1 它也不会引发任何类转换异常。例如:第一个在 Adaptor 的 currentList 中有 7 个项目(6 个 Object1 + 1 Add More)然后我删除了 1 个对象,让它成为索引为 6 的对象。现在当 diffUtil 检查 areItemsSame() 时,它不会抛出异常. 根据我的想法,6 处的 oldItem 将是 Object1,因为该项目已被删除,这意味着现在 6 索引处的项目是 Add More,现在将其转换为 Object1 应该抛出 ClassCastException

我的差异实用程序代码

override fun areContentsTheSame(oldItem: DataItem, newItem: DataItem): Boolean {
            if (oldItem is DataItem.ItemToDoCat)
            Log.v("Recycler","Old :${(oldItem).toDoCategory.category} ,New ${(newItem as DataItem.ItemToDoCat).toDoCategory.category}")
            return when (oldItem) {

            //Since i am only checking for oldItem, casting newItem should throw an Exception as per my example
                is DataItem.ItemToDoCat -> (oldItem).toDoCategory == (newItem as DataItem.ItemToDoCat).toDoCategory
                is DataItem.ItemAddPlaceHolder -> oldItem == newItem
            }
        }

这是添加测试之前的日志

2020-05-28 17:14:42.226 32588-1009/com.example.todomaster V/Recycler: Old :Default ,New Default
2020-05-28 17:14:42.226 32588-1009/com.example.todomaster V/Recycler: Old :Personal ,New Personal
2020-05-28 17:14:42.226 32588-1009/com.example.todomaster V/Recycler: Old :Work ,New Work

添加测试后的日志

2020-05-28 17:44:58.643 10717-10779/com.example.todomaster V/Recycler: Old :Default ,New Default
2020-05-28 17:44:58.644 10717-10779/com.example.todomaster V/Recycler: Old :Personal ,New Personal
2020-05-28 17:44:58.644 10717-10779/com.example.todomaster V/Recycler: Old :Work ,New Work

删除测试后的日志

2020-05-28 17:51:33.116 10717-11005/com.example.todomaster V/Recycler: Old :Default ,New Default
2020-05-28 17:51:33.116 10717-11005/com.example.todomaster V/Recycler: Old :Personal ,New Personal
2020-05-28 17:51:33.116 10717-11005/com.example.todomaster V/Recycler: Old :Work ,New Work

如您所见,删除后 Log 甚至没有记录 oldList 的测试对象,这意味着 oldList 没有带有测试对象的实例

4

0 回答 0