在更新RecycleViewAdapter中的List的内容之后,DiffUtil areContentsTheSame始终返回true

问题描述

这是我的RecyclerView适配器类。从列表用户界面中单击一个项目应将特定项目更改为黑色到白色。单击一个项目后,我正在从UI类中将项目0的状态更改为1,基于该状态,UI应该会对该项目进行更改。但是在diffUtil内部,areContentTheSame()的结果为true。

class TimeSlotsAdapter(val adapterItemOnClick: (TimeSlots) -> Unit):RecyclerView.Adapter<TimeSlotsAdapter.TimeSlotsViewHolder>() {

private lateinit var binding: RvTimeSlotsBinding
private var timeSlots: List<TimeSlots> = ArrayList<TimeSlots>()


inner class TimeSlotsViewHolder : RecyclerView.ViewHolder {
    constructor(rvBinding: RvTimeSlotsBinding) : super(rvBinding.root) {
    }

    fun setItem(timeSlots: TimeSlots) {
        binding.timeSlotView.setOnClickListener { adapterItemOnClick(timeSlots) }
    }
}

override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): TimeSlotsViewHolder {
    binding =
        RvTimeSlotsBinding.inflate(LayoutInflater.from(parent.context),parent,false)
    return TimeSlotsViewHolder(binding)
}

override fun onBindViewHolder(holder: TimeSlotsViewHolder,position: Int) {
    timeSlots[position]?.let { currentSlot ->
        with(holder) {

            if (currentSlot.status == "1") {
                binding.timeSlotView.background =
                    ContextCompat.getDrawable(
                        binding.timeSlotView.context,R.drawable.time_slot_item_bg
                    )
                binding.timeSlotTv.setTextColor(
                    ContextCompat
                        .getColor(binding.timeSlotTv.context,R.color.black)
                )
                binding.timeSlotTv.text = "1 " + currentSlot.time

                Timber.e("${currentSlot.time} ${currentSlot.status}")
            } else {
                binding.timeSlotView.background =
                    ContextCompat.getDrawable(
                        binding.timeSlotView.context,R.drawable.black_bg
                    )
                binding.timeSlotTv.setTextColor(
                    ContextCompat
                        .getColor(binding.timeSlotTv.context,R.color.white)
                )
                binding.timeSlotTv.text = "0 " + currentSlot.time
                Timber.e("${currentSlot.time} ${currentSlot.status}")
            }
            setItem(currentSlot)
        }
    }
}

override fun getItemCount(): Int = timeSlots.size

fun submitSlots(timeSlotList: List<TimeSlots>) {
    val oldList = timeSlots
    val diffResult: DiffUtil.DiffResult = DiffUtil.calculateDiff(
        TimeSlotsDiffCallBack(
            oldList,timeSlotList
        )
    )
    timeSlots = timeSlotList
    diffResult.dispatchUpdatesTo(this)
}

class TimeSlotsDiffCallBack(
    var oldTimeSlotsList: List<TimeSlots>,var newTimeSlotsList: List<TimeSlots>
) : DiffUtil.Callback() {

    override fun getOldListSize(): Int = oldTimeSlotsList.size

    override fun getNewListSize(): Int = newTimeSlotsList.size

    override fun areItemsTheSame(oldItemPosition: Int,newItemPosition: Int): Boolean {
        return (oldTimeSlotsList[oldItemPosition].time
                == newTimeSlotsList[newItemPosition].time)
    }

    override fun areContentsTheSame(oldItemPosition: Int,newItemPosition: Int): Boolean {
        val oldTimeSlots = oldTimeSlotsList[oldItemPosition].status
        val newTimeSlots = newTimeSlotsList[newItemPosition].status
        Timber.e("old: $oldTimeSlots new: $newTimeSlots")
        return oldTimeSlots == newTimeSlots
    }
}

}

这是用于提交适配器列表的UI类。在doClickTimeSlot()下面,我正在更新项目的状态。

class TimeSlotBottomSheetFragment : BottomSheetDialogFragment(){
private val obj: List<TimeSlots> = mutableListOf<TimeSlots>(
    TimeSlots("09:30","0"),TimeSlots("10:30",TimeSlots("11:30",TimeSlots("12:30",TimeSlots("14:30",TimeSlots("15:30",TimeSlots("16:30",TimeSlots("17:30",TimeSlots("18:30",TimeSlots("19:30",TimeSlots("20:30",TimeSlots("21:30","0")
)

private fun doClickTimeSlot(timeSlots: TimeSlots) {
    val newList: ArrayList<TimeSlots> = ArrayList<TimeSlots>()
    newList.addAll(obj)
    for (i in newList.indices) {
        if (newList[i].time == timeSlots.time) {
            newList[i].status = "1"
            Timber.e("" + newList[i].time + " " + newList[i].status)
        } else {
            newList[i].status = "0"
            Timber.e("" + newList[i].time + " " + newList[i].status)
        }
    }
    adapter.submitSlots(newList)
}
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...