如何修改RecyclerView列表项中按钮点击状态下的背景颜色
实现步骤
- 第一步:给数据模型新增选中状态存储字段
因为RecyclerView存在视图复用机制,按钮选中状态必须保存在对应数据源中,否则滚动列表时会出现状态错乱。修改ListModel类新增选中状态字段:
public class ListModel { // 保留原有字段和get/set方法不变 private boolean isSelected; // 新增字段,默认false代表未选中状态 public boolean isSelected() { return isSelected; } public void setSelected(boolean selected) { isSelected = selected; } }
- 第二步:在ViewHolder中绑定按钮控件
先在列表项布局R.layout.item_produit_liverer中给目标按钮设置id(示例id为btn_switch,可根据实际情况修改),之后修改ListViewHolder类声明并绑定按钮:
public class ListViewHolder extends RecyclerView.ViewHolder { // 保留原有控件声明和绑定逻辑不变 Button btnSwitch; public ListViewHolder(@NonNull View itemView) { super(itemView); // 保留原有findViewById逻辑不变 btnSwitch = itemView.findViewById(R.id.btn_switch); } }
- 第三步:在适配器中添加点击切换逻辑
在onBindViewHolder方法中根据数据源状态设置按钮背景,同时绑定点击事件切换状态,需要先在res/values/colors.xml中添加对应颜色值:
<resources> <!-- 按钮默认和选中状态颜色,可自行修改色值 --> <color name="btn_default">#2196F3</color> <color name="btn_selected">#F44336</color> </resources>
修改适配器的onBindViewHolder方法:
@Override public void onBindViewHolder(@NonNull ListViewHolder listViewHolder, int position) { // 保留原有设置文本的逻辑不变 listViewHolder.command_i.setText(data.get(position).getCommand_m()); listViewHolder.name_i.setText(data.get(position).getName_m()); listViewHolder.commune_i.setText(data.get(position).getCommune_m()); listViewHolder.providence_i.setText(data.get(position).getProvidence_m()); ListModel currentItem = data.get(position); // 根据数据源的选中状态设置按钮背景 if (currentItem.isSelected()) { listViewHolder.btnSwitch.setBackgroundColor(ContextCompat.getColor(context, R.color.btn_selected)); } else { listViewHolder.btnSwitch.setBackgroundColor(ContextCompat.getColor(context, R.color.btn_default)); } // 绑定按钮点击事件 listViewHolder.btnSwitch.setOnClickListener(v -> { // 切换当前条目的选中状态 currentItem.setSelected(!currentItem.isSelected()); // 只刷新当前条目,避免全局刷新浪费性能 notifyItemChanged(position); }); }
- (可选)使用Selector简化背景切换
也可以通过Drawable选择器减少代码中的判断逻辑,在res/drawable目录下新建btn_switch_bg.xml:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:drawable="@color/btn_selected"/> <item android:drawable="@color/btn_default"/> </selector>
给按钮布局的android:background属性设置为@drawable/btn_switch_bg,之后onBindViewHolder中只需要修改一行即可:
// 替换原有的背景判断逻辑,直接和数据源的选中状态绑定即可 listViewHolder.btnSwitch.setSelected(currentItem.isSelected());
内容的提问来源于stack exchange,提问作者Bakir Lakaf
相关产品推荐
相关产品推荐

