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

Android多个RecyclerView共用同一Adapter的可行性及实现咨询

一、多RecyclerView复用同一Adapter的合理性

这种做法完全符合开发规范,前提是不同RecyclerView的布局结构、交互逻辑相似度较高。像你当前场景中两个列表都是单TextView的item结构、仅需支持点击事件,完全可以复用同一个Adapter,避免重复编写高度雷同的代码,降低维护成本。如果后续不同列表的布局、交互逻辑差异变大,再拆分独立Adapter也不迟。

二、自动切换适配逻辑的实现方案

你可以给Adapter新增类型标记,初始化时自动识别传入的数据集类型,所有逻辑根据标记判断执行即可,修改后的代码如下:

public class RecyclerViewAdapter extends RecyclerView.Adapter <RecyclerViewAdapter.MyViewHolder> {
    // 列表类型常量定义
    public static final int TYPE_TASK = 0;
    public static final int TYPE_CATEGORY = 1;

    private ArrayList<Task> taskList;
    private ArrayList<String> categories;
    private OnItemListener mOnItemListener;
    // 当前适配器对应的列表类型
    private int currentType;

    // 任务列表专用构造方法
    public RecyclerViewAdapter(ArrayList<Task> taskList, OnItemListener onItemListener) {
        this.taskList = taskList;
        this.mOnItemListener = onItemListener;
        this.currentType = TYPE_TASK;
    }

    // 分类列表专用构造方法
    public RecyclerViewAdapter(ArrayList<String> categories, OnItemListener onItemListener) {
        this.categories = categories;
        this.mOnItemListener = onItemListener;
        this.currentType = TYPE_CATEGORY;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // 若后续不同类型列表布局不同,可根据viewType加载不同布局
        TextView textView = (TextView) LayoutInflater.from(parent.getContext()).inflate(R.layout.single_view, parent, false);
        return new MyViewHolder(textView, mOnItemListener);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        if (currentType == TYPE_TASK) {
            holder.textView.setText(taskList.get(position).getTaskName());
        } else if (currentType == TYPE_CATEGORY) {
            holder.textView.setText(categories.get(position));
        }
    }

    @Override
    public int getItemCount() {
        if (currentType == TYPE_TASK) {
            return taskList == null ? 0 : taskList.size();
        } else {
            return categories == null ? 0 : categories.size();
        }
    }

    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView textView;
        OnItemListener onItemListener;

        MyViewHolder(@NonNull View itemView, OnItemListener onItemListener) {
            super(itemView);
            textView = itemView.findViewById(R.id.singleView);
            this.onItemListener = onItemListener;
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            onItemListener.onItemClick(getAdapterPosition());
        }
    }

    public interface OnItemListener {
        void onItemClick(int position);
    }
}
三、使用方式
  • 任务列表初始化:new RecyclerViewAdapter(你的Task数据集, 点击事件监听器)
  • 分类列表初始化:new RecyclerViewAdapter(你的分类字符串数据集, 点击事件监听器)

如果后续需要新增其他同类型列表,只需新增类型常量、对应构造方法,再在各个生命周期回调中补充对应判断逻辑即可,无需拆分Adapter。若后续不同列表的item布局差异较大,只需重写getItemViewType方法返回对应类型,在onCreateViewHolder中根据viewType加载不同布局即可。

内容的提问来源于stack exchange,提问作者random1234

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:15:04