RecyclerView中如何让新选中项显示边框、之前选中的项隐藏边框

实现步骤
1. 定义边框颜色状态选择器
在res/color目录下新建card_stroke_color.xml(无color目录可手动新建),内容如下:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="#2196F3" android:state_selected="true" /> <item android:color="@android:color/transparent" /> </selector>
色值#2196F3可替换为你需要的边框颜色。
2. 配置MaterialCardView布局
单个条目的根布局MaterialCardView参考配置:
<com.google.android.material.card.MaterialCardView android:id="@+id/item_card" android:layout_width="match_parent" android:layout_height="wrap_content" android:clickable="true" android:focusable="true" app:strokeColor="@color/card_stroke_color" app:strokeWidth="2dp" app:cardElevation="0dp"> <!-- 卡片内部自定义布局 --> </com.google.android.material.card.MaterialCardView>
strokeWidth可根据需求调整边框粗细,不需要默认按压阴影效果可额外添加stateListAnimator="@null"属性。
3. 逻辑控制选中状态
场景1:两个固定卡片
直接给两个卡片绑定点击事件,切换选中状态即可:
// 默认选中左侧卡片 leftCard.isSelected = true rightCard.isSelected = false leftCard.setOnClickListener { leftCard.isSelected = true rightCard.isSelected = false } rightCard.setOnClickListener { rightCard.isSelected = true leftCard.isSelected = false }
场景2:RecyclerView列表多条目
在Adapter中添加选中位置记录变量,逻辑参考如下:
class YourAdapter : RecyclerView.Adapter<YourAdapter.ViewHolder>() { // 记录当前选中位置,默认选中第0位 var selectedPos = 0 override fun onBindViewHolder(holder: ViewHolder, position: Int) { holder.itemCard.isSelected = (position == selectedPos) holder.itemView.setOnClickListener { val oldPos = selectedPos selectedPos = holder.adapterPosition // 仅刷新新旧两个位置,性能更优 notifyItemChanged(oldPos) notifyItemChanged(selectedPos) } } }
内容的提问来源于stack exchange,提问作者Prosenjith Roy
相关产品推荐
相关产品推荐

