如何从Activity中设置RecyclerView选中项的颜色
RecyclerView条目单选变色实现方案
1. 自定义Adapter核心实现
在Adapter中内置选中状态记录,同时对外暴露控制方法和点击回调:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { // 记录当前选中的条目位置,默认-1表示无选中 private int currentSelectedPos = -1; private OnItemClickListener mListener; // 条目点击回调接口 public interface OnItemClickListener { void onItemClick(int position); } public void setOnItemClickListener(OnItemClickListener listener) { mListener = listener; } // 对外暴露设置选中位置的方法,供Activity调用 public void setSelectedPosition(int position) { currentSelectedPos = position; } public int getSelectedPosition() { return currentSelectedPos; } @Override public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { // 根据选中状态设置样式 if (currentSelectedPos == position) { // 选中样式:可自定义背景、文字颜色等 holder.itemView.setBackgroundColor(Color.parseColor("#FFE4B5")); holder.tvContent.setTextColor(Color.RED); } else { // 普通未选中样式 holder.itemView.setBackgroundColor(Color.WHITE); holder.tvContent.setTextColor(Color.BLACK); } // 设置条目点击事件 holder.itemView.setOnClickListener(v -> { if (mListener != null) { mListener.onItemClick(position); } }); } // 其余ViewHolder创建、getItemCount等常规代码省略 static class MyViewHolder extends RecyclerView.ViewHolder { TextView tvContent; public MyViewHolder(@NonNull View itemView) { super(itemView); tvContent = itemView.findViewById(R.id.tv_content); } } }
2. Activity端控制选中逻辑
所有选中状态的切换统一在Activity层面处理,避免Adapter内部自行处理导致状态和Activity不同步
public class MainActivity extends AppCompatActivity { private MyAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RecyclerView recyclerView = findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(this)); adapter = new MyAdapter(); recyclerView.setAdapter(adapter); // 设置条目点击回调 adapter.setOnItemClickListener(position -> { int lastSelectedPos = adapter.getSelectedPosition(); // 更新选中位置 adapter.setSelectedPosition(position); // 刷新旧选中条目,恢复为普通样式 if (lastSelectedPos != -1) { adapter.notifyItemChanged(lastSelectedPos); } // 刷新新选中条目,更新为选中样式 adapter.notifyItemChanged(position); }); } }
可选优化点
- 如果需要初始默认选中某条,只需要在Adapter初始化后调用
adapter.setSelectedPosition(0)再调用notifyItemChanged(0)刷新即可 - 选中样式可以封装成
StateListDrawable实现,无需在代码中手动判断设置颜色
内容的提问来源于stack exchange,提问作者Muhammad Sajid
相关产品推荐
相关产品推荐

