使用或学习地址: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不对怎么办,由于篇幅有限此处直接贴出成品