孟老板 BaseAdapter封装 (一) 简单封装
- BaseAdapter封装(一) 简单封装
- BaseAdapter封装(二) Header,footer
- BaseAdapter封装(三) 空数据占位图
- BaseAdapter封装(四) PageHelper
- ListAdapter系列
- Paging3 系列
1.简单封装
前言:
RecyclerView.Adapter的用法这里就不再赘述,新入行或者还在用ListView的小伙伴 请自行百度;
1.1 分析:
我们来分析一下每个 Adapter 都有的东西,及通用的逻辑:
数据集合: 数据 List<T> mData; 布局加载器 LayoutInflater; 上下文 Context; 事件监听 Listener;
方法: 设置及取出数据; getItemCount判空;
那么我们的 BaseAdapter 如下所示; 我们使用了泛型<T>; 其余代码也比较简单易懂;
public abstract class BaseAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
protected LayoutInflater layoutInflater;
protected Context mContext;
/**
* 点击事件回调监听; 条目点击用 holder.itemView.setOnClickListener
* 子类调用需要判 null
*/
protected AdapterListener mListener;
/**
* 数据集合
*/
protected List<T> mData;
public BaseAdapter(Context context, List<T> data) {
this(context,data,null);
}
public BaseAdapter(Context context, List<T> data , AdapterListener listener) {
this.mContext = context;
this.mListener = listener;
this.mData = data;
layoutInflater = LayoutInflater.from(context);
}
public List<T> getData() {
return mData;
}
public void setData(List<T> data) {
mData = data;
notifyDataSetChanged();
}
public AdapterListener getListener() {
return mListener;
}
public void setListener(AdapterListener listener) {
mListener = listener;
}
@Override
public int getItemCount() {
//数据集合为 null 时返回0;
if(mData != null)
return mData.size();
return 0;
}
@Override
public int getItemViewType(int position) {
return getMyType(position);
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return createMyHolder(parent,viewType);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder recHolder, final int position) {
onBindMyData(recHolder,position);
}
/**
* 默认的条目类型, 如果多条目类型, 自定义该方法; 根据 position 获取对象实体, 再判断条目类型;
*/
protected int getMyType(int position){
return 0;
}
/**
* 绑定 holder
*/
protected abstract RecyclerView.ViewHolder createMyHolder(@NonNull ViewGroup parent, int viewType);
/**
* 绑定数据,绑定监听
*/
protected abstract void onBindMyData(@NonNull RecyclerView.ViewHolder recHolder, final int position);
public interface AdapterListener {
public void onItemClick(View v, int position);
}
具体的 Adapter 这样写:
public class TestAdapter extends BaseAdapter<DateBean> { public TestAdapter (Context context, List<FamilyDateBean> data, AdapterListener listener) { super(context, data, listener); } @Override protected RecyclerView.ViewHolder createMyHolder(@NonNull ViewGroup parent, int viewType) { return new ViewHolder(layoutInflater.inflate(R.layout.item_family_date, parent, false)); } @Override protected void onBindMyData(@NonNull RecyclerView.ViewHolder recHolder, int position) { ViewHolder holder = (ViewHolder) recHolder; DateBean bean = mData.get(position); holder.tvWeek.setText(bean.getWeek()); holder.tvDate.setText(bean.getDate()); //设置点击事件监听 holder.itemView.setOnClickListener(v->mListener.onItemClick(v,recHolder.getLayoutPosition()));
}
static class ViewHolder extends RecyclerView.ViewHolder{ @BindView(R.id.tv_week) TextView tvWeek; @BindView(R.id.tv_date) TextView tvDate; ViewHolder(View view) { super(view); ButterKnife.bind(this, view); } } }