多Activity复用RecyclerView Adapter实现不同Item点击跳转需求
完全不用为每个Activity单独创建Adapter!这是个非常典型的回调接口应用场景,既能最大化复用你的Adapter代码,又能让每个宿主Activity灵活定义自己的Item点击逻辑。下面给你几种实用的实现方案:
方法一:通过自定义回调接口实现解耦
这是最通用、最易维护的方案,核心思路是把点击逻辑从Adapter中抽离,交给每个Activity自己处理:
首先在你的通用Adapter里定义一个点击回调接口,同时提供设置监听器的方法:
public class CommonListAdapter extends RecyclerView.Adapter<CommonListAdapter.ViewHolder> { private List<YourDataModel> mDataList; // 定义点击回调接口 public interface OnItemClickListener { void onItemClicked(int position); } private OnItemClickListener mItemClickListener; // 提供设置监听器的公开方法 public void setOnItemClickListener(OnItemClickListener listener) { mItemClickListener = listener; } // 构造方法、ViewHolder定义等常规代码... @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { // 绑定数据到视图的逻辑... // 给ItemView绑定点击事件,触发回调 holder.itemView.setOnClickListener(v -> { if (mItemClickListener != null) { mItemClickListener.onItemClicked(position); } }); } }
然后在每个Activity中,给Adapter设置监听器,自定义跳转逻辑:
// 汽车列表Activity CommonListAdapter carAdapter = new CommonListAdapter(carDataList); carAdapter.setOnItemClickListener(position -> { if (position == 0) { startActivity(new Intent(this, SedanActivity.class)); } // 其他位置Item的跳转逻辑... }); mRecyclerView.setAdapter(carAdapter); // 飞机列表Activity CommonListAdapter planeAdapter = new CommonListAdapter(planeDataList); planeAdapter.setOnItemClickListener(position -> { if (position == 0) { startActivity(new Intent(this, PrivatePlaneActivity.class)); } // 其他位置Item的跳转逻辑... }); mRecyclerView.setAdapter(planeAdapter);
方法二:用Lambda简化代码(Java 8+ / Kotlin)
如果你的项目支持Java 8及以上,或者用Kotlin开发,可以直接把点击逻辑作为函数参数传给Adapter,代码会更简洁:
Java版Adapter可以通过Consumer函数式接口接收点击逻辑:
public class CommonListAdapter extends RecyclerView.Adapter<CommonListAdapter.ViewHolder> { private List<YourDataModel> mDataList; private Consumer<Integer> mOnItemClickAction; // 构造方法直接接收点击逻辑 public CommonListAdapter(List<YourDataModel> dataList, Consumer<Integer> onItemClickAction) { mDataList = dataList; mOnItemClickAction = onItemClickAction; } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { // 绑定数据... holder.itemView.setOnClickListener(v -> { if (mOnItemClickAction != null) { mOnItemClickAction.accept(position); } }); } }
Activity中创建Adapter时直接传入Lambda:
// 船只列表Activity CommonListAdapter boatAdapter = new CommonListAdapter(boatDataList, position -> { if (position == 0) { startActivity(new Intent(this, SpeedBoatActivity.class)); } // 其他位置Item的跳转逻辑... }); mRecyclerView.setAdapter(boatAdapter);
为什么这些方案更优?
- 完全复用Adapter:不用重复编写大量冗余的Adapter代码,新增Activity时只需要几行点击逻辑
- 职责清晰:Adapter只负责数据绑定和视图创建,跳转逻辑交给对应的Activity处理,符合单一职责原则
- 扩展性极强:哪怕后续新增几十页列表,只需要在对应Activity中定义自己的点击行为即可
内容的提问来源于stack exchange,提问作者Modest
相关产品推荐
相关产品推荐

