使用通用Adapter与ViewHolder时RecyclerView无法显示数据
通用RecyclerView Adapter与ViewHolder实现
我在自己的Android项目里封装了一套通用的RecyclerView Adapter和ViewHolder,能帮我减少重复代码,加快列表页面的开发速度。下面是具体的实现代码和设计思路:
BaseRecyclerViewAdapter 核心代码
public class BaseRecyclerViewAdapter extends RecyclerView.Adapter<BaseViewHolder> { private ItemClickListener itemClickListener; private List<? extends Object> objectArrayList; private int layout; private BaseViewHolder baseViewHolder; public BaseRecyclerViewAdapter(int layout, ItemClickListener itemClickListener, List<? extends Object> objectArrayList) { this.layout = layout; this.itemClickListener = itemClickListener; this.objectArrayList = objectArrayList; } @Override public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false); return new BaseViewHolder(itemView, itemClickListener); } @Override public void onBindViewHolder(BaseViewHolder holder, int position) { holder.bindData(objectArrayList.get(position)); } @Override public int getItemCount() { return objectArrayList == null ? 0 : objectArrayList.size(); } // 可选:提供更新数据的方法 public void updateData(List<? extends Object> newData) { this.objectArrayList = newData; notifyDataSetChanged(); } }
BaseViewHolder 实现
public class BaseViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private ItemClickListener itemClickListener; private SparseArray<View> viewCache; public BaseViewHolder(View itemView, ItemClickListener itemClickListener) { super(itemView); this.itemClickListener = itemClickListener; this.viewCache = new SparseArray<>(); itemView.setOnClickListener(this); } // 通用视图获取方法,避免重复调用findViewById @SuppressWarnings("unchecked") public <T extends View> T getView(int viewId) { View view = viewCache.get(viewId); if (view == null) { view = itemView.findViewById(viewId); viewCache.put(viewId, view); } return (T) view; } // 抽象数据绑定方法,子类可重写实现具体逻辑 public void bindData(Object data) { // 默认空实现,由子类根据业务需求扩展 } @Override public void onClick(View v) { if (itemClickListener != null) { itemClickListener.onItemClick(getAdapterPosition()); } } }
配套的ItemClickListener 接口
public interface ItemClickListener { void onItemClick(int position); }
设计亮点
- 通用性:通过
List<? extends Object>支持任意类型的数据列表,只需传入对应的布局ID就能适配不同样式的列表项。 - 减少重复代码:ViewHolder中封装了视图缓存逻辑,避免在每个Adapter中重复编写
findViewById的代码。 - 统一事件处理:通过
ItemClickListener接口统一管理列表项的点击事件,无需在每个Adapter中单独实现点击监听。
内容的提问来源于stack exchange,提问作者Bitcoin
相关产品推荐
相关产品推荐

