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

如何在RecyclerView中实现点击按钮时仅单个按钮显示EQUIPPED?

解决方案:通过数据驱动实现单选装备状态

核心思路是用数据层控制UI状态,避免直接操作RecyclerView的条目View,适配RecyclerView的复用机制,保证状态一致性。

1. 给物品模型添加装备状态字段

在你的物品数据类(比如GameItem)里新增布尔字段,标记当前物品是否被装备:

data class GameItem(
    val id: Int,
    val imageRes: Int,
    val isPurchased: Boolean,
    var isEquipped: Boolean = false // 新增装备状态标记
)

2. 在Adapter中维护选中状态并处理点击

在RecyclerView的Adapter里记录当前被装备的物品ID,点击按钮时更新数据并精准刷新列表:

class GameItemAdapter(private val itemList: MutableList<GameItem>) :
    RecyclerView.Adapter<GameItemAdapter.ItemViewHolder>() {

    private var currentEquippedId: Int = -1 // 记录当前装备的物品ID

    inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val itemImage: ImageView = itemView.findViewById(R.id.item_image)
        val equipBtn: Button = itemView.findViewById(R.id.equip_btn)

        fun bind(item: GameItem) {
            itemImage.setImageResource(item.imageRes)
            // 根据装备状态设置按钮文本
            equipBtn.text = if (item.isEquipped) "EQUIPPED" else "EQUIP"
            
            // 按钮点击逻辑
            equipBtn.setOnClickListener {
                // 取消之前装备物品的状态
                itemList.find { it.id == currentEquippedId }?.let { oldItem ->
                    oldItem.isEquipped = false
                    notifyItemChanged(itemList.indexOf(oldItem))
                }
                // 设置当前物品为装备状态
                item.isEquipped = true
                currentEquippedId = item.id
                notifyItemChanged(adapterPosition)
            }
        }
    }

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

    override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
        holder.bind(itemList[position])
    }

    override fun getItemCount() = itemList.size
}

3. 初始化数据时设置默认装备状态

如果有默认装备的物品(比如初始物品),初始化列表时要同步设置对应状态和选中ID:

// 示例初始化数据
val itemList = mutableListOf(
    GameItem(1, R.drawable.item1, isPurchased = true, isEquipped = true),
    GameItem(2, R.drawable.item2, isPurchased = true),
    GameItem(3, R.drawable.item3, isPurchased = true)
)
val adapter = GameItemAdapter(itemList)
adapter.currentEquippedId = 1 // 绑定初始装备的物品ID

关键注意点

  • 禁止直接操作其他条目View:RecyclerView条目会复用,直接修改View会导致滑动时状态混乱,必须通过修改数据+notifyItemChanged刷新UI。
  • 用ID而非位置记录选中状态:如果列表有排序、增删操作,物品ID比位置更可靠,避免位置错乱。
  • 适配未购买物品:如果存在未购买物品,可在bind方法中处理按钮状态:
    equipBtn.isEnabled = item.isPurchased
    equipBtn.visibility = if (item.isPurchased) View.VISIBLE else View.GONE
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:30:50