在 RecyclerView 的 onClick 中更改项目

Changing Item in onClick of RecyclerView

我有一个显示在 recyclerview 中的联系人列表。单击一个项目后,它的视图会以我想要的方式发生变化,如果我单击另一个项目,则之前选择的项目 returns 回到其原始状态,所以到目前为止一切都很好。但是,当我单击之前已单击的项目并展开时,什么也没有发生。这是我在 onBindViewHolder

中的代码
if(selectedPosition==position){
if(holder.itemView.contactsListOptionsMenu.isVisible){
    holder.itemView.contactsListOptionsMenu.visibility = View.GONE
    holder.itemView.contactsListCallBtn.visibility = View.GONE
    holder.itemView.contactsListDetailsBtn.visibility = View.GONE
    holder.itemView.contactFullName.setCompoundDrawablesRelativeWithIntrinsicBounds(0,0,R.drawable.ic_arrow_down_24,0)
} else{
    holder.itemView.contactsListOptionsMenu.visibility = View.VISIBLE
    holder.itemView.contactsListCallBtn.visibility = View.VISIBLE
    holder.itemView.contactsListDetailsBtn.visibility = View.VISIBLE
    holder.itemView.contactFullName.setCompoundDrawablesRelativeWithIntrinsicBounds(0,0,R.drawable.ic_arrow_up_24,0)
}

} 否则 { 如果(holder.itemView.contactsListOptionsMenu.isVisible){

    holder.itemView.contactsListOptionsMenu.visibility = View.GONE
    holder.itemView.contactsListCallBtn.visibility = View.GONE
    holder.itemView.contactsListDetailsBtn.visibility = View.GONE
    holder.itemView.contactFullName.setCompoundDrawablesRelativeWithIntrinsicBounds(0,0,R.drawable.ic_arrow_down_24,0)
}

}

我需要做什么才能在再次单击时折叠已展开的项目,反之亦然?

在逻辑中使用视图可见性不是一个好主意。您应该使用 selectedPosition 变量来查找当前选择的 ViewHolder。

然后在视图持有者上单击:

  • 如果第一次点击视图持有者,将位置分配给 selectedPosition。

  • 如果视图持有者之前被点击,现在又被点击,则将 -1 分配给所选位置。

  • 调用 notifyDataSetChanged() 更新 UI。

您可以在 onBindViewHolder() 中执行此操作:

    holder.itemView.setOnClickListener {
        selectedPosition = if (position == selectedPosition) {
            -1
        } else {
            position
        }
        notifyDataSetChanged()
    }

    if (selectedPosition == position) {
        holder.itemView.contactsListOptionsMenu.visibility = View.VISIBLE
        holder.itemView.contactsListCallBtn.visibility = View.VISIBLE
        holder.itemView.contactsListDetailsBtn.visibility = View.VISIBLE
        holder.itemView.contactFullName.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, R.drawable.ic_arrow_up_24, 0)
    } else {
        holder.itemView.contactsListOptionsMenu.visibility = View.GONE
        holder.itemView.contactsListCallBtn.visibility = View.GONE
        holder.itemView.contactsListDetailsBtn.visibility = View.GONE
        holder.itemView.contactFullName.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, R.drawable.ic_arrow_down_24, 0)
    }