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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:54:04