首页 > 技术文章 > 孟老板 BaseAdapter封装 (一) 简单封装

mymy-android 2021-06-07 16:04 原文

 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); } } }

 回到顶部

推荐阅读