Android简单基类封装(二)——RecyclerView BaseAdapter

使用或学习地址:https://github.com/weimingjue/BaseAdapter

封装的第一条:理清思路,RV最大的痛点:没有点击事件,list的时候还要额外写一堆重复代码,没有header、footer

第二条:寻找解决办法,点击事件在bind时可以设置;列表时传入list将size返回;headerfooter也是list产生的问题,只需要增加3种type:HEADER、FOOTER、BODY即可

第三条:建立封装,由于adapter有普通的和list的两种需求,所以我们应该创建2个类:BaseAdapterRv、BaseAdapterRvList。

这里List是普通Adapter的一种特殊表现,所以BaseAdapterRvList必须是BaseAdapterRv的子类

由于多数博客鱼龙混杂,本博客如果让你非常满意或解决了大家的根本性问题,希望多多支持在下方点赞和回复一下,举手之劳方便大家。

开始实施,先写BaseAdapterRv

public abstract class BaseAdapterRv<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {

    protected OnItemClickListener mListener;

    @Override
    public void onBindViewHolder(VH holder, final int position) {
        //创建点击事件
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mListener.onItemClick(v, position);
            }
        });
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        mListener = listener;
        notifyDataSetChanged();
    }
}

似乎很完美,但真正使用的时候发现:onBindViewHolder必须写super,不小心删掉了就gg了;onCreateViewHolder每次都要LayoutInflater;onBindViewHolder调用本身就很频繁,创建了大量无用listener对象。

解决问题的办法:将onBindViewHolder加finale并增加抽象类onBindVH;onCreateViewHolder同理加final增加抽象类onCreateViewHolder三参;listener不是有view吗,view不是有tag吗,所以把position放在tag里完美解决。

public abstract class BaseAdapterRv<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {
    public final String TAG = getClass().getSimpleName();

    protected final Activity mActivity;
    protected final LayoutInflater mInflater;
    protected OnItemClickListener mListener;

    public BaseAdapterRv(Activity activity) {
        mActivity = activity;
        mInflater = LayoutInflater.from(mActivity);
    }

    @Override
    public final VH onCreateViewHolder(ViewGroup parent, int viewType) {
        return onCreateViewHolder(parent, viewType, mInflater);
    }

    @Override
    public void onBindViewHolder(VH holder, final int position) {
        holder.itemView.setTag(R.id.tag_view_click, position);
        //创建点击事件
        holder.itemView.setOnClickListener(mListener);
        onBindVH(holder, position);
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        mListener = listener;
        notifyDataSetChanged();
    }

    @NonNull
    protected abstract VH onCreateViewHolder(ViewGroup parent, int viewType, LayoutInflater inflater);

    protected abstract void onBindVH(VH holder, int position);
}
public abstract class OnItemClickListener implements View.OnClickListener {
    @Override
    public final void onClick(View view) {
        int position = (Integer) view.getTag(R.id.tag_view_click);
        onItemClick(view, position);
    }

    public abstract void onItemClick(View view, int listPosition);

}

id如何生成,在res/values创建ids.xm

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--复用时的setOnClickListener-->
    <item name="tag_view_click" type="id"/>
</resources>

思路大致就是这样啦,剩下的可以想想list继承之后该做什么、list如何添加header和footer、添加header和footer后如何添加点击事件、如何添加长按事件、header和footer显示不全怎么办、notify动画后position不对怎么办,由于篇幅有限此处直接贴出成品

使用或学习地址:https://github.com/weimingjue/BaseAdapter

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值