如何在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
相关产品推荐
相关产品推荐

