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. GIF图片裁剪出指定大小的GIF图片

    前言 最近在博客后台上传图片的时候,突然发现上传gif图片的时候裁剪图片有问题.既没法裁剪gif指定区域的图片,又没法裁剪指定区域生成一个新的指定大小的gif图.本来想直接去找个裁剪的库直接放上去的, ...

  2. WPF之数据绑定基类

    数据绑定方法 在使用集合类型作为列表控件的ItemsSource时一般会考虑使用ObservalbeCollection,它实现了INotifyCollectionChanged和INotifyPro ...

  3. Java中读取文件的几种路径配置

    获取配置文件的两种方式区别 ClassLoader.getSystemClassLoader().getResourceAsStream() //ClassLoader.getSystemClassL ...

  4. idea中properties配置文件没有代码提示及代码高亮问题解决方案

    更多精彩关注微信公众号 1.解决properties文件没有代码提示问题:首先,单击项目结构按钮,如下图: 然后,给项目添加Spring依赖支持,如下图: 2.解决代码不高亮问题:     代码不高亮 ...

  5. linux中定时运行php(每分钟执行一次为例)

    注:使用Crontab定时执行php脚本文件 1. 安装crontab yum install crontabs 说明:/sbin/service crond start //启动服务/sbin/se ...

  6. SQL必学必会笔记 —— 基础篇

    基础篇 SQL语言按照功能划分 DDL(DataDefinitionLanguage),也就是数据定义语言,它用来定义我们的数据库对象,包括 数据库.数据表和列.通过使用DDL,可以创建,删除和修改数 ...

  7. [BD] HBase

    NoSQL数据库 关系型数据库:用表格的行-列来保存数据,OLTP,写入多,行式存储 非关系型数据库:只用来存储数据,业务逻辑由应用程序处理,OLAP,查询多,列式存储 常见NoSQL数据库 Redi ...

  8. [刷题] PTA 6-11 求自定类型元素序列的中位数 (25分)

    采用希尔排序 1 #include <stdio.h> 2 3 #define MAXN 10 4 typedef float ElementType; 5 6 ElementType M ...

  9. Msf--永恒之蓝 ms17_010

    |>>>中华人民共和国网络安全法<<<|警告:请勿用于非法用途,后果自负! 简介 一.概述 永恒之蓝是指2017年4月14日晚,黑客团体Shadow Brokers ...

  10. 如何在 CentOS 8 中安装 Cockpit Web 控制台

    如何在 CentOS 8 中安装 Cockpit Web 控制台 [日期:2019-10-31] 来源:Linux公社  作者:醉落红尘 [字体:大 中 小]   在本文中,我们将帮助您在CentOS ...