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)
,overrideonBindViewHolder
方法调用了所有不可见的单元格,因此我的屏幕延迟了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
}