如何在 recyclerview 中更改某些项目的属性

How to change certain item's properties in recyclerview

我想在单击图像视图时更改它的背景颜色,我在更改项目的位置属性时遇到了问题,它是 int,因为位置是 int,我无法访问它的属性,这是我的代码:

package com.example.myapplication.recyclerView.otherCategoryIcon

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.recyclerview.widget.RecyclerView
import com.example.myapplication.R
import com.example.myapplication.icons


class OtherCategoryIcon(): RecyclerView.Adapter<OtherCategoryIcon.ItemViewHolder>() {
    val list = icons
    class ItemViewHolder(view: View): RecyclerView.ViewHolder(view) {
        val icon: (ImageView) = view.findViewById(R.id.icon)
    }


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

    override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
        val item = list[position]
        holder.icon.setImageResource(item)
        holder.icon.setOnClickListener {
            holder.icon.background = holder.itemView.context.resources.getDrawable(R.color.blue_400, null)
            holder.icon.background.alpha = 75
            val lastPosition = holder.adapterPosition - 1
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
        val adapter = LayoutInflater.from(parent.context).inflate(R.layout.icons_layout, parent, false)
        return ItemViewHolder(adapter)
    }
}

如何更改?

试试这个:

class OtherCategoryIcon(): RecyclerView.Adapter<OtherCategoryIcon.ItemViewHolder>() {
    
    var lastViewHolder: ItemViewHolder? = null
    val list = icons


    class ItemViewHolder(view: View): RecyclerView.ViewHolder(view) {
        val icon: (ImageView) = view.findViewById(R.id.icon)
    }


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

    override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
        val item = list[position]
        holder.icon.setImageResource(item)
        holder.icon.setOnClickListener {
            holder.icon.background = holder.itemView.context.resources.getDrawable(R.color.blue_400, null)
            holder.icon.background.alpha = 75

            // last click viewholder
            lastViewHolder?.let {
                it.icon.background = it.itemView.context.resources.getDrawable(R.color.blue_400, null)
                it.icon.background.alpha = 1.0
            }
            lastViewHolder = holder
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
        val adapter = LayoutInflater.from(parent.context).inflate(R.layout.icons_layout, parent, false)
        return ItemViewHolder(adapter)
    }
}

在当前设计中,每次绑定 ViewHolder 时都会创建一个新的 OnClickListener 对象。这可能会降低您的应用程序的速度,因此您应该转而将 ViewHolder 设为 OnClickListener。这是 Phil 回答的改进版本:

class OtherCategoryIcon: RecyclerView.Adapter<OtherCategoryIcon.ItemViewHolder>() {

    var lastViewHolder: ItemViewHolder? = null
    val list = icons


    inner class ItemViewHolder(view: View): RecyclerView.ViewHolder(view), View.OnClickListener {
        private val icon: (ImageView) = view.findViewById(R.id.icon)

        fun fill(item: Int){
            icon.setImageResource(item)
            icon.setOnClickListener(this)
        }

        override fun onClick(v: View?) {
            //Android studio warns about using ResourcesCompat instead so here it is.
            val background = ResourcesCompat.getDrawable(
                itemView.context.resources,
                R.color.blue_400,
                null
            )
            icon.background = background
            icon.background.alpha = 75

            // last click viewHolder
            lastViewHolder?.let {
                it.icon.background = background
                it.icon.background.alpha = 1
            }
            lastViewHolder = this
        }
    }


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

    override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
        val item = list[position]
        holder.fill(item)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
        val adapter = LayoutInflater.from(parent.context).inflate(R.layout.icons_layout, parent, false)
        return ItemViewHolder(adapter)
    }
}