You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在RecyclerView的item被点击时修改其Alpha值

实现方案&优化建议

你当前的代码已经实现了点击时修改alpha为0.5的逻辑,但存在RecyclerView复用导致状态错乱的问题,滑动后被滑出屏幕的item再滑回来时alpha会重置为默认值,以下是完整修复方案:

第一步:修改Gift数据类新增选中状态字段

给你的Gift实体类加一个选中状态标记,用来持久化每个item的选中状态:

data class Gift(
    val imageResource: Int,
    val price: String,
    val sold_num: String,
    val medal_num: String,
    var isSelected: Boolean = false // 新增选中状态字段,默认未选中
)

第二步:修改Adapter逻辑适配状态同步

修改后的完整Adapter代码如下:

package GiftClass

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.gearsrun.www.R
import kotlinx.android.synthetic.main.item_gift.view.*

class GiftAdapter(private val giftList: List<Gift>) : RecyclerView.Adapter<GiftAdapter.GiftViewHolder>() {
    private lateinit var mlistener : onItemClickListener
    interface onItemClickListener{
        fun onItemClick(position: Int)
    }
    fun setOnItemClickListener(listener: onItemClickListener){
        mlistener = listener
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GiftViewHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.item_gift,parent,false)
        return GiftViewHolder(itemView,mlistener)
    }

    override fun onBindViewHolder(holder: GiftViewHolder, position: Int) {
        val currentItem = giftList[position]
        holder.item_img.setImageResource(currentItem.imageResource)
        holder.item_price.text = currentItem.price
        holder.item_soldNum.text = currentItem.sold_num
        holder.item_medal.text = currentItem.medal_num
        // 绑定的时候根据选中状态设置alpha,解决复用错乱问题
        holder.itemView.alpha = if(currentItem.isSelected) 0.5f else 1f
    }

    override fun getItemCount() = giftList.size

    class GiftViewHolder(itemView: View,listener:onItemClickListener) : RecyclerView.ViewHolder(itemView){
        val item_img:ImageView = itemView.item_img
        val item_price : TextView = itemView.price
        val item_soldNum : TextView = itemView.sold_num
        val item_medal : TextView = itemView.medal_num

        init {
            itemView.setOnClickListener {
                val position = absoluteAdapterPosition
                if(position != RecyclerView.NO_POSITION){ // 加边界判断避免无效位置崩溃
                    listener.onItemClick(position)
                    // 更新选中状态
                    val currentItem = (itemView.parent as RecyclerView).adapter?.let { adapter ->
                        (adapter as GiftAdapter).giftList[position]
                    }
                    currentItem?.let {
                        it.isSelected = !it.isSelected
                        // 只刷新当前item性能更好
                        (itemView.parent as RecyclerView).adapter?.notifyItemChanged(position)
                    }
                }
            }
        }

    }
}

可选拓展:添加点击动画

如果需要更柔和的alpha切换效果,可以把直接赋值alpha的逻辑改成属性动画:

// 替换holder.itemView.alpha = xxx的逻辑
holder.itemView.animate()
    .alpha(if(currentItem.isSelected) 0.5f else 1f)
    .setDuration(200)
    .start()

内容的提问来源于stack exchange,提问作者Yellow Clock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:09:03