RecyclerView 项目在单击项目时随机更改

RecyclerView items changes randomly on clicking an item

我有一个 RecyclerView 列表,我想改变点击项目的颜色。但是每当我单击一个项目时,RecyclerView 项目都会随机更改。

我还在我的数据中使用了一个布尔值 class 来跟踪项目选择。

数据class

data class OrderAvailableDaysResponseItem(
val actual_date: String,
val day_name: String,
val date_name: String,
val day_num: Int,

// For item selection
var isDateSelected: Boolean)

在我的片段中,检查点击的项目是否与列表项目匹配并将 isDateSelected 更新为 true,然后调用 notifydatasetchanged。

private var availableDaysList: OrderAvailableDaysResponse = OrderAvailableDaysResponse()
orderAvailableDaysAdapter.setDateClickListener {
        for(resItem in availableDaysList){
            resItem.isDateSelected = resItem.date_name == it.date_name
        }
        orderAvailableDaysAdapter.notifyDataSetChanged()
    }

适配器点击监听器

var onDateClickListener: ((OrderAvailableDaysResponseItem) -> Unit)? = null
fun setDateClickListener(listener: (OrderAvailableDaysResponseItem) -> Unit){
    onDateClickListener = listener
}

inner class AvailableDaysViewHolder(binding: ItemAvailableDaysBinding) : RecyclerView.ViewHolder(binding.root) {
    fun setBindings(itemRes: OrderAvailableDaysResponseItem){
        binding.resItem = itemRes
        binding.executePendingBindings()

        binding.clRoot.setOnClickListener {
            onDateClickListener?.let {
                it(itemRes)
            }
        }

    }
}

具体情况请参考附件

正如您在点击某个项目时看到的那样,这些项目会随机变化。请帮我。我错过了什么吗?

编辑 1:

完整的适配器代码

class OrderAvailableDaysAdapter(var orderAvailableDaysResponseList: OrderAvailableDaysResponse) : RecyclerView.Adapter<OrderAvailableDaysAdapter.AvailableDaysViewHolder>() {

private lateinit var binding: ItemAvailableDaysBinding

var onDateClickListener: ((OrderAvailableDaysResponseItem) -> Unit)? = null
fun setDateClickListener(listener: (OrderAvailableDaysResponseItem) -> Unit){
    onDateClickListener = listener
}

inner class AvailableDaysViewHolder(binding: ItemAvailableDaysBinding) : RecyclerView.ViewHolder(binding.root) {
    fun setBindings(itemRes: OrderAvailableDaysResponseItem){
        binding.resItem = itemRes
        binding.executePendingBindings()

        binding.clRoot.setOnClickListener {
            onDateClickListener?.let {
                it(itemRes)
            }
        }
    }
}

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

override fun onBindViewHolder(holder: AvailableDaysViewHolder, position: Int) {
    holder.setBindings(orderAvailableDaysResponseList[position])
}

override fun getItemCount(): Int {
    return orderAvailableDaysResponseList.size
}}

从适配器中删除 private lateinit var binding: ItemAvailableDaysBinding,不要“全局”保留它,初始化只进行一次,在 onCreateViewHolder

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

这个“全局”对象的相同命名和 AvailableDaysViewHolder 内部 class 可能会混淆它并且 setBindings 可能会在最后初始化的(全局保留的)对象上调用而不是这个传递在构造函数中