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

