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

使用通用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:57:21