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

回到顶部

孟老板 BaseAdapter封装 (一) 简单封装的更多相关文章

  1. 孟老板 BaseAdapter封装(五) ListAdapter

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  2. 孟老板 BaseAdapter封装 (二) Healer,footer

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  3. 孟老板 BaseAdapter封装 (三) 空数据占位图

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  4. 孟老板 BaseAdapter封装(四) PageHelper

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  5. 孟老板 ListAdapter封装, 告别Adapter代码 (上)

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  6. 孟老板 ListAdapter封装, 告别Adapter代码 (三)

    BaseAdapter系列 ListAdapter封装, 告别Adapter代码 (一) ListAdapter封装, 告别Adapter代码 (二) ListAdapter封装, 告别Adapter ...

  7. 孟老板 ListAdapter封装, 告别Adapter代码 (四)

    BaseAdapter系列 ListAdapter封装, 告别Adapter代码 (一) ListAdapter封装, 告别Adapter代码 (二) ListAdapter封装, 告别Adapter ...

  8. Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池

    前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...

  9. FMDB简单封装和使用

    工具:火狐浏览器+SQLite Manager插件 ; Xcode; FMDB库; 效果: 项目地址: https://github.com/sven713/PackFMDB 主要参考这两篇博客: 1 ...

随机推荐

  1. hdu1251 hash或者字典树

    题意: 统计难题 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量 ...

  2. android添加账户流程分析涉及漏洞修复

    android修复了添加账户代码中的2处bug,retme取了很酷炫的名字launchAnyWhere.broadAnywhere(参考资料1.2).本文顺着前辈的思路学习bug的原理和利用思路. 我 ...

  3. Python中的Pexpect模块的简单使用

    Pexpect 是一个用来启动子程序并对其进行自动控制的 Python 模块. Pexpect 可以用来和像 ssh.ftp.passwd.telnet 等命令行程序进行自动交互.以下所有代码都是在K ...

  4. POJ1703带权并查集(距离或者异或)

    题意:       有两个黑社会帮派,有n个人,他们肯定属于两个帮派中的一个,然后有两种操作 1 D a b 给出a b 两个人不属于同一个帮派 2 A a b 问a b 两个人关系 输出 同一个帮派 ...

  5. Java发送邮件报错:com.sun.mail.util.LineOutputStream.<init>(Ljava/io/OutputStream;Z)V

    在练习使用Java程序发送邮件的代码 运行出现了com.sun.mail.util.LineOutputStream.<init>(Ljava/io/OutputStream;Z)V报错信 ...

  6. VS Code 远程开发

    听说有人想用VS Code实现远程开发,今天他来了 Remote Development Always reveal the SSH login terminal, 还可加装免密登录,一键登录尽显奢华 ...

  7. 交互-通过axios拦截器添加token认证

    通过axios拦截器添加token认证 一.通过axios请求拦截器添加token,保证拥有获取数据的权限 通常访问接口需要相关权限,通常是需要携带token如下所示 那如何在请求头中添加token? ...

  8. [bug] MapReduce卡死

    参考 https://blog.csdn.net/WYpersist/article/details/80202055

  9. [刷题] 200 Number of Islands

    要求 给定一个二维数组,只有0和1两个字符,1代表陆地,0代表水域,纵向和横向的陆地连接成岛屿,被水域隔开,求出地图中有多少岛屿 思路 对要查找的区域进行双重循环遍历,寻找陆地 从陆地初始点开始进行深 ...

  10. javaWeb——jsp

    JavaBean 提供一个默认的无参构造函数 需要被序列化并且实现了 Serializable 接口 可能有一系列可读写属性 可能有一系列的 getter 或 setter 方法