Android RecyclerView notifyItemChanged调用BindViewHolder也在不可见单元格上

Android RecyclerView notifyItemChanged调用BindViewHolder也在不可见单元格上,android,android-recyclerview,Android,Android Recyclerview,我有一个垂直的RecyclerView,带有LinearLayoutManager,具有不同的项目类型和一个ViewHolder。这是一个信息屏幕 我想在单击单元格时显示/隐藏消息日期 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val layout = R.layout.xxx val viewHolder = ViewHolder(LayoutI

我有一个垂直的
RecyclerView
,带有
LinearLayoutManager
,具有不同的项目类型和一个
ViewHolder
。这是一个信息屏幕

我想在单击单元格时显示/隐藏消息日期

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val layout = R.layout.xxx
        val viewHolder = ViewHolder(LayoutInflater.from(parent.context).inflate(layout, parent, false))


        viewHolder.itemView.layout?.setOnClickListener {
            setMessageDateVisibility(viewHolder)
        }

        return viewHolder
    }
因此,我添加了使用
notifyItemChanged(pos)

但最后的问题是,由于这一行
notifyItemChanged(pos)
,override
onBindViewHolder
方法调用了所有不可见的单元格,因此我的屏幕延迟了150/200个单元格


你能帮我找到解决方案吗?

你试过删除notifyItemChanged吗?@Vikas是的,我试过删除notifyItemChanged,调用任何视图,但日期视图的可见性不会改变尝试在onBindViewHolder内设置单击侦听器。在
onBindViewHolder
中,为什么要使用
holder.layoutPosition
而不是
mDataset[pos]
position
参数?@shinwan好问题,我想我习惯了这个
private fun setMessageDateVisibility(holder: ViewHolder) {
        val pos = holder.adapterPosition
        if (pos.toLong() == THREAD_DEFAULT_POSITION)
            return

        val message = mDataset[pos]

        message.isDateVisible = !message.isDateVisible
        notifyItemChanged(pos)
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val message = mDataset[position]

        itemView.message_date.text = message.date
        itemView.message_date.visibility = if (message.isDateVisible)
            View.VISIBLE
        else
            View.GONE
    }