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

RecyclerView Adapter中实现ImageView单选高亮功能求助

实现RecyclerView图片单选高亮的解决方案

兄弟,你这问题很好解决,核心就是要跟踪当前选中的位置,并在点击和绑定视图时更新UI状态。我给你把适配器代码修改好,一步步拆解逻辑:

1. 新增选中位置变量

在AddEditAccountAdapter类里添加一个变量,用来记录当前选中的图片位置(初始值设为-1表示没有选中项):

class AddEditAccountAdapter(private var context: Context, private var accountImages: ArrayList<String>) : RecyclerView.Adapter<AccountViewHolder>() {
    // 新增:记录当前选中的位置
    private var selectedPosition: Int = -1

    // ... 其他原有代码
}

2. 修改onBindViewHolder方法

在绑定每个图片项的时候,根据当前位置是否为选中位置,动态设置背景(选中加高亮,未选中用默认背景),同时更新点击事件逻辑:

override fun onBindViewHolder(holder: AccountViewHolder, position: Int) {
    val accountImageId = context.resources.getIdentifier(accountImages[position], "drawable", context.packageName)
    holder.accountImage.setImageResource(accountImageId)

    // 关键:根据选中状态设置背景
    if (position == selectedPosition) {
        holder.accountImage.setBackgroundResource(R.drawable.image_highlight)
    } else {
        // 这里可以设置你的默认背景,比如透明或者其他默认drawable,0表示清除背景
        holder.accountImage.setBackgroundResource(0)
    }

    // 修改点击事件:处理单选逻辑
    holder.accountImage.setOnClickListener {
        // 先保存之前选中的位置,方便后续刷新
        val previousPosition = selectedPosition
        // 更新当前选中位置为点击的位置
        selectedPosition = position
        // 只刷新之前选中的项和当前选中的项,比notifyDataSetChanged更高效
        notifyItemChanged(previousPosition)
        notifyItemChanged(selectedPosition)
    }
}

逻辑说明

  • selectedPosition专门用来记录当前被选中的图片位置,每次点击时更新这个值。
  • 点击后调用notifyItemChanged刷新之前选中的项和当前选中的项,这样之前选中的图片会去掉高亮边框,当前选中的会加上,实现单选效果。
  • 如果你的ImageView有默认背景,记得把setBackgroundResource(0)改成你的默认背景资源ID,比如R.drawable.default_image_bg。

完整修改后的适配器代码

import android.content.Context
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView

class AccountViewHolder(view: View) : RecyclerView.ViewHolder(view) {
    var accountImage: ImageView = view.findViewById(R.id.account_image_placeholder)
}

class AddEditAccountAdapter(private var context: Context, private var accountImages: ArrayList<String>) : RecyclerView.Adapter<AccountViewHolder>() {
    // 记录当前选中的位置,初始-1表示无选中项
    private var selectedPosition: Int = -1

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

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

    override fun onBindViewHolder(holder: AccountViewHolder, position: Int) {
        val accountImageId = context.resources.getIdentifier(accountImages[position], "drawable", context.packageName)
        holder.accountImage.setImageResource(accountImageId)

        // 根据选中状态设置背景
        if (position == selectedPosition) {
            holder.accountImage.setBackgroundResource(R.drawable.image_highlight)
        } else {
            // 替换成你的默认背景,这里用0清除背景示例
            holder.accountImage.setBackgroundResource(0)
        }

        // 单选逻辑处理
        holder.accountImage.setOnClickListener {
            val previousPosition = selectedPosition
            selectedPosition = position
            // 刷新前后两个位置的视图
            notifyItemChanged(previousPosition)
            notifyItemChanged(selectedPosition)
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:46:09