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
相关产品推荐
相关产品推荐

