RecyclerView基础(一)Adapter与Holder的封装之RvAdapter,RvHolder

  • 使用Recyclerview已经有一段时间了,打算把自己项目中用到的知识点写成一个系列,作为自己技术成长的一个记录,今天简单写一下Adapter与Holder的封装。

如果我想实现一张如下的列表

普通列表

封装之前的代码
  • NormalAdapter的代码
public class NormalAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private List<String> mList;
    private RvListener mRvListener;
    private Context mContext;
    private LayoutInflater mLayoutInflater;

    public NormalAdapter(List<String> list, Context context, RvListener rvListener) {
        mList = list;
        mRvListener = rvListener;
        mContext = context;
        mLayoutInflater = LayoutInflater.from(context);
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mLayoutInflater.inflate(R.layout.item_demo, parent, false);
        return new NormalHolder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        ((NormalHolder) holder).tvDemo.setText(mList.get(position));
    }

    @Override
    public int getItemCount() {
        return mList == null ? 0 : mList.size();
    }

    private class NormalHolder extends RecyclerView.ViewHolder {
        private TextView tvDemo;
        NormalHolder(View itemView) {
            super(itemView);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mRvListener.onItemClick(v.getId(), getAdapterPosition());
                }
            });
            tvDemo = (TextView) itemView.findViewById(R.id.tv_demo);
        }
    }
}复制代码
代码优化
  • 对象复用:Adapter中的List,RvListener,Context,LayoutInflater都可以抽取到一个父类里面,List可以用泛型进行限定
  • 监听事件:Holer中的点击事件是每个Recyclerview都需要的,可以进行抽取Holder到父类,实现Holder的解耦
  • 分离Holder:holder里面主要是进行View的初始化操作以及数据的绑定,抽取出来之后逻辑更加清晰
重构后的代码
  • RvAdapter
public abstract class RvAdapter<T> extends RecyclerView.Adapter<RvHolder> {
    protected List<T> list;
    protected Context mContext;
    protected RvListener listener;
    protected LayoutInflater mInflater;

    public RvAdapter(Context context, List<T> list, RvListener listener) {
        mContext = context;
        mInflater = LayoutInflater.from(context);
        this.list = list;
        this.listener = listener;
    }

    @Override
    public RvHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return getHolder(parent, viewType);
    }

    @Override
    public void onBindViewHolder(RvHolder holder, int position) {
        holder.bindHolder(list.get(position), position);
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    @Override
    public int getItemViewType(int position) {
        return 0;
    }

    protected abstract RvHolder getHolder(ViewGroup parent, int viewType);


}复制代码
  • RvHolder
public abstract class RvHolder<T> extends RecyclerView.ViewHolder {
    private RvListener mListener;

    public RvHolder(View itemView, int type, RvListener listener) {
        super(itemView);
        this.mListener = listener;
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mListener.onItemClick(v.getId(), getAdapterPosition());
            }
        });
    }

    public abstract void bindHolder(T t, int position);

}复制代码
  • NormalAdapter
public class NormalAdapter extends RvAdapter<String> {

    public NormalAdapter(Context context, List<String> list, RvListener listener) {
        super(context, list, listener);
    }

    @Override
    protected RvHolder getHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.item_demo, parent, false);
        return new NormalHolder(view, viewType, listener);
    }

}复制代码
  • NormalHolder
public class NormalHolder extends RvHolder<String> {
    private TextView tvDemo;
    public NormalHolder(View itemView, int type, RvListener listener) {
        super(itemView, type, listener);
        tvDemo = (TextView) itemView.findViewById(R.id.tv_demo);
    }

    @Override
    public void bindHolder(String s, int position) {
        tvDemo.setText(s);
    }
}复制代码
总结
  1. 搞Android开发,java基础的确很重要,封装,继承,多态这些如果能够灵活运用可以让开发高效很多。
  2. 不能以战术上的勤奋代理战略上的懒惰,规划好了往往能事半功倍。
  3. 任何事情都是小马过河,去做了,才发现没有那么难,也没有那么简单。

Demo下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值