概述

在Android开发过程中,我们经常会用到adapter。因为adapter在基本使用的过程中,代码比较繁琐,于是进行一个简单封装,使调用起来更加简单便捷。这节就来讲讲这个适配器的封装吧。

前言

在Android开发过程中,我们经常会用到adapter。因为adapter在基本使用的过程中,代码比较繁琐,于是进行一个简单封装,使调用起来更加简单便捷。这节就来讲讲这个适配器的封装吧。

今天涉及的内容:

adapter库依赖

封装类ComAdapter和GroupAdapter概述

通用适配器ComAdapter的使用

分组适配器GroupAdapter的使用

MainActivity中调用示例

效果图和项目结构图

先来波adapter使用的效果图吧

image

一. adapter库依赖

Github地址

本adapter的封装是建立在一个第三方库的基础之上的。在使用之前,你需要添加该库的依赖:

将JitPack存储库添加到您的构建文件中(项目根目录下build.gradle文件):

allprojects {

repositories {

google()

jcenter()

maven { url 'https://jitpack.io' }

}

}

添加依赖项以最新版本为准:

dependencies {

implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.34'

}

二.封装类ComAdapter和GroupAdapter概述

适配器库BaseRecyclerViewAdapterHelper是一个专注adapter的库,里面有一个适配器基类:BaseQuickAdapter,为了方便日常调度使用,我在BaseQuickAdapter基础上再度扩展,分别整合了两个adapter基类:ComAdapter和GroupAdapter。

ComAdapter:基于一般的列表或九宫格布局的使用

GroupAdapter:基于简单的分组列表展示使用。

三.通用适配器ComAdapter的使用

ComAdapter是一个通用适配器基类,里面集成了adapter创建需要的一些基本方法,包括控件初始化,获取布局对象,加载动画,列表数据加载,控件点击事件监听等方法。 当你要实现一个线性列表,需要创建adapter的时候,继承ComAdapter可以帮你快速实现自己的adapter。

3.1 继承ComAdapter,写自己的Adapter

当RecyclerView加载列表的时候,需要一个适配器(NameAdapter),你可以像这样快速来创建它:

public class NameAdapterextends ComAdapter {

private TextView mTvName;

public NameAdapter(List data, Context context) {

//加载布局和数据

super(R.layout.item_layout, data, context);

}

@Override

public void initView(BaseViewHolder viewHolder, T obj) {

//控件初始化

mTvName=viewHolder.getView(R.id.tv);

}

@Override

public void initData(BaseViewHolder viewHolder, T obj) {

String name=obj.toString();

mTvName.setText(name);

}

@Override

public void setListener(BaseViewHolder viewHolder, T obj) {

//添加控件监听

addOnClickListener(mTvName,viewHolder,obj);

}

}

3.2 线性布局调用

mNames=new ArrayList<>();

//for (int i = 0; i < 10; i++) {

// mNames.add("小黄"+i);

//}

mNameAdapter=new NameAdapter<>(mNames,MainActivity.this);

mNameAdapter.setRecyclerLinearManager(mRecyclerView);

3.3 九宫格布局调用

mNames=new ArrayList<>();

//for (int i = 0; i < 10; i++) {

// mNames.add("小黄"+i);

//}

mNameAdapter=new NameAdapter<>(mNames,MainActivity.this);

mNameAdapter.setRecyclerGridManager(mRecyclerView,4);

3.4 设置分割线,返回RecyclerView.ItemDecoration对象

//设置线性布局分割线

LinearDividerItemDecoration linearDivider=mNameAdapter.setLinearLayoutItemSpace(mRecyclerView,5,R.color.colorAccent);

//设置九宫格局分割线

GridDividerItemDecoration gridDivider=mNameAdapter.setGridLayoutItemSpace(mRecyclerView,5,R.color.colorAccent);

3.5 移除分割线

/**移除RecycleView间距**/

removeItemSpace(RecyclerView recyclerView, RecyclerView.ItemDecoration divider)

3.6 点击事件

//点击事件

mNameAdapter.setOnItemClickListener(new AdapterHelper.OnItemClickListener() {

@Override

public void itemClickListener(View view, BaseViewHolder viewHolder, Object obj) {

switch (view.getId()) {

case R.id.tv:

ToastUtil.shortShow("====1====="+obj.toString());

break;

default:

break;

}

}

});

四. 分组适配器GroupAdapter的使用

GroupAdapter是一个列表分组显示的适配器基类,里面集成了adapter创建需要的一些基本方法,包括控件初始化,获取布局对象,加载动画,列表数据加载,控件点击事件监听等方法。 当你要船创建一个分组显示功能的adapter,继承GroupAdapter可方便快捷实现

4.1 javaBean继承SectionEntity类

GroupAdapter显示的数据,都需要用javaBean进行封装。并且JavaBean需要继承SectionEntity类,然后重写含(boolean isHeader, String header)参数的构造方法。 以Person对象为例,你需要这样处理:

public class Person extends SectionEntity {

private String name;

private int age;

public Person(boolean isHeader, String header) {

super(isHeader,header);

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return "Person{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

}

4.2 继承GroupAdapter,写自己的adapter

然后写一个自己的adapter,继承自GroupAdapter,以PersonAdapter为例:

public class PersonAdapter extends GroupAdapter {

//header

private TextView mTvHeader;

//item

private TextView mTvItem;

public PersonAdapter(List data, Context context) {

super(R.layout.item_layout, R.layout.header_layout, data,context);

}

@Override

protected void convertHead(BaseViewHolder viewHolder, SectionEntity item) {

//标题相关所有都在此处理

//标题初始化

mTvHeader=viewHolder.getView(R.id.tv_title);

//标题数据处理

mTvHeader.setText(item.header);

//标题点击事件

addOnClickListener(mTvHeader,viewHolder,item);

}

@Override

public void initView(BaseViewHolder viewHolder, T obj) {

//item初始化

mTvItem=viewHolder.getView(R.id.tv);

}

@Override

public void initData(BaseViewHolder viewHolder, T obj) {

//item数据处理

Person person= (Person) obj;

mTvItem.setText("姓名:"+person.getName()+" 年龄:"+person.getAge());

}

@Override

public void setListener(BaseViewHolder viewHolder, T obj) {

//item中控件监听

addOnClickListener(mTvItem,viewHolder,obj);

}

}

其中PersonAdapter(List data, Context context)构造方法的super方法中,要引入两个布局id,一个是item的一个是header的。 Header相关方法都在convertHead中处理。item的相关处理在initView,initData和setListener方法中进行。

4.3 线性布局使用

mPersonList=new ArrayList<>();

//for (int i = 0; i < 10; i++) {

//Person person;

//if(i%7==0){//header

// person=new Person(true,"标题"+i);

//}else{//item

// person=new Person(false,null);

// person.setName("小黑"+i);

// person.setAge(25+i);

// }

// mPersonList.add(person);

//}

mPersonAdapter=new PersonAdapter<>(mPersonList,MainActivity.this);

mPersonAdapter.setRecyclerLinearManager(mRecyclerView);

4.4 九宫格布局使用

mPersonList=new ArrayList<>();

//for (int i = 0; i < 10; i++) {

//Person person;

//if(i%7==0){//header

// person=new Person(true,"标题"+i);

//}else{//item

// person=new Person(false,null);

// person.setName("小黑"+i);

// person.setAge(25+i);

// }

// mPersonList.add(person);

//}

mPersonAdapter=new PersonAdapter<>(mPersonList,MainActivity.this);

mPersonAdapter.setRecyclerGridManager(mRecyclerView,3);

4.5 设置分割线,返回RecyclerView.ItemDecoration对象

线性布局的时候,可以像下面这样设置分割线:

//线性布局分割线

LinearDividerItemDecoration linearDivider=mPersonAdapter.setLinearLayoutItemSpace(mRecyclerView, 5, R.color.colorAccent);

注意: 在实现分组适配器不能使用setGridLayoutItemSpace给列表设置分割线,会出现ui上显示的bug,为了避免 用户使用不当,我已经将GroupAdapter类中的setGridLayoutItemSpace抛出异常并做以错误提示。大家若还是需要在分组九宫格布局中做分割线的话, 需要自己在布局中,或者在adapter中处理数据的时候,用代码来实现分割线效果。

4.6 移除分割线

/**移除RecycleView间距**/

removeItemSpace(RecyclerView recyclerView, RecyclerView.ItemDecoration divider)

4.7 点击事件

若要设置adapter的点击事件,你可以像下面这样写:

//点击事件

mPersonAdapter.setOnItemClickListener(new AdapterHelper.OnItemClickListener() {

@Override

public void itemClickListener(View view, BaseViewHolder viewHolder, Object obj) {

Person person= (Person) obj;

switch (view.getId()) {

case R.id.tv_title://header

ToastUtil.shortShow("===="+person.header+"===");

break;

case R.id.tv://item

ToastUtil.shortShow("===="+person.getName()+"===");

break;

default:

break;

}

}

});

五.MainActivity中调用示例

下面贴出adapter在MainActivity中使用的代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private Button mBtn1;

private Button mBtn2;

private Button mBtn3;

private Button mBtn4;

private RecyclerView mRecyclerView;

private ListmNames;

private NameAdaptermNameAdapter;

private ListmPersonList;

private PersonAdaptermPersonAdapter;

private LinearDividerItemDecoration mLinearDivider;

private GridDividerItemDecoration mGridDivider;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initData();

setListener();

}

private void initData() {

mBtn1 = findViewById(R.id.btn1);

mBtn2 = findViewById(R.id.btn2);

mBtn3 = findViewById(R.id.btn3);

mBtn4 = findViewById(R.id.btn4);

mRecyclerView = findViewById(R.id.rv);

mBtn1.setText("通用线性");

mBtn2.setText("通用九宫");

mBtn3.setText("分组线性");

mBtn4.setText("分组九宫");

}

private void setListener() {

mBtn1.setOnClickListener(this);

mBtn2.setOnClickListener(this);

mBtn3.setOnClickListener(this);

mBtn4.setOnClickListener(this);

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.btn1://通用布局线性测试

commonLinearLayout();

break;

case R.id.btn2://通用布局九宫格测试

commonGridLayout();

break;

case R.id.btn3://分组布局线性测试

diffGropLinearLayout();

break;

case R.id.btn4://分组布局九宫格测试

diffGropGridLayout();

break;

default:

break;

}

//点击事件

commonDiffClick();

}

private void initCommonData(){

//通用布局

if(mNames==null) {

mNames = new ArrayList<>();

}

mNames.clear();

for (int i = 0; i < 10; i++) {

mNames.add("小黄" + i);

}

}

private void initdiffGropData(){

//分组布局

if(mPersonList==null) {

mPersonList = new ArrayList<>();

}

mPersonList.clear();

for (int i = 0; i < 10; i++) {

Person person;

if(i%7==0){//header

person=new Person(true,"标题"+i);

}else{//item

person=new Person(false,null);

person.setName("小黑"+i);

person.setAge(25+i);

}

mPersonList.add(person);

}

}

/**

* 通用布局线性测试

**/

private void commonLinearLayout() {

initCommonData();

mNameAdapter = new NameAdapter<>(mNames, MainActivity.this);

mNameAdapter.setRecyclerLinearManager(mRecyclerView);

//清除旧的分割线

mNameAdapter.removeItemSpace(mRecyclerView,mLinearDivider);

mNameAdapter.removeItemSpace(mRecyclerView,mGridDivider);

//设置分割线

mLinearDivider=mNameAdapter.setLinearLayoutItemSpace(mRecyclerView, 5, R.color.colorAccent);

}

/**

* 通用布局九宫格测试

**/

private void commonGridLayout() {

initCommonData();

mNameAdapter = new NameAdapter<>(mNames, MainActivity.this);

mNameAdapter.setRecyclerGridManager(mRecyclerView, 3);

//清除旧的分割线

mNameAdapter.removeItemSpace(mRecyclerView,mLinearDivider);

mNameAdapter.removeItemSpace(mRecyclerView,mGridDivider);

//设置分割线

mGridDivider=mNameAdapter.setGridLayoutItemSpace(mRecyclerView, 5, R.color.colorAccent);

}

/**

* 分组布局线性测试

**/

private void diffGropLinearLayout() {

initdiffGropData();

mPersonAdapter=new PersonAdapter<>(mPersonList,MainActivity.this);

mPersonAdapter.setRecyclerLinearManager(mRecyclerView);

//清除旧的分割线

mNameAdapter.removeItemSpace(mRecyclerView,mLinearDivider);

mNameAdapter.removeItemSpace(mRecyclerView,mGridDivider);

//设置分割线

mLinearDivider=mPersonAdapter.setLinearLayoutItemSpace(mRecyclerView, 5, R.color.colorAccent);

}

/**

* 分组布局九宫格测试

**/

private void diffGropGridLayout() {

initdiffGropData();

mPersonAdapter=new PersonAdapter<>(mPersonList,MainActivity.this);

mPersonAdapter.setRecyclerGridManager(mRecyclerView,3);

//清除旧的分割线

mNameAdapter.removeItemSpace(mRecyclerView,mLinearDivider);

mNameAdapter.removeItemSpace(mRecyclerView,mGridDivider);

}

/**点击事件**/

private void commonDiffClick(){

//通用布局点击事件

if(mNameAdapter!=null) {

mNameAdapter.setOnItemClickListener(new AdapterHelper.OnItemClickListener() {

@Override

public void itemClickListener(View view, BaseViewHolder viewHolder, Object obj) {

switch (view.getId()) {

case R.id.tv:

ToastUtil.shortShow("====1=====" + obj.toString());

break;

default:

break;

}

}

});

}

//分组布局点击事件

if(mPersonAdapter!=null) {

mPersonAdapter.setOnItemClickListener(new AdapterHelper.OnItemClickListener() {

@Override

public void itemClickListener(View view, BaseViewHolder viewHolder, Object obj) {

Person person = (Person) obj;

switch (view.getId()) {

case R.id.tv_title://header

ToastUtil.shortShow("====" + person.header + "===");

break;

case R.id.tv://item

ToastUtil.shortShow("====" + person.getName() + "===");

break;

default:

break;

}

}

});

}

}

}

六. 效果图和项目结构图

效果图

image

项目结构图

image

最后

虽然万能适配器方便好用,但是我还是推荐使用原生写法,因为原生写法更灵活,不会出现莫名的问题。万能适配器的动画目前可能有点毛病,谨慎使用列表动画!

android数据适配器参数,Android 万能适配器BRVAH相关推荐

  1. android通用listview和gridview万能适配器实现的两种方式

    Listview和gridview是超级常用组件,于是乎,应该封装一下直接拿来用用而不是每次都写Adapter,这样多么的麻烦是不.虽然国内外大牛都有封装过,但是我总结了两个封装好的Adapter分享 ...

  2. Java泛型应用之打造Android中ListView和GridView万能适配器【CommonAdapter】--超简洁写法

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/52813227 [DylanAndroid的csdn博客] 在android中使 ...

  3. Android数据备份(Android Data Backup)

    最近我在阅读Android Developer上的文章,本文是对其中一篇Data Backup的翻译.希望可以通过翻译英文技术文章提高自己阅读英文文档的水平,如果有不妥的地方,希望指出,谢谢~因为这个 ...

  4. android app传递参数,Android APP调起另外一个APP并传值

    概述 为了增加用户体验,可能要求在一个APP中打开另外一个APP的需求,一般分为三种: 显式调用跳转 隐式调用跳转 URL Scheme跳转 代码 用到的一些公共方法,当打开APP时,检测到第三方AP ...

  5. android 序列化传参数,android 传值 序列化

    Activity之间传数据时,为了避免麻烦,往往会将一些值封装成对象,然后将整个对象传递过去.传对象的时候有两种情况,一种是实现Parcelable接口,一种是实现Serializable接口. 0. ...

  6. android数据存储心得,android学习心得 轻量级存储SharePreferences

    SharedPreferences是Android中存储简单数据的一个工具类.可以想象它是一个小小的Cookie,它通过用键值对的方式把简单数据类型(boolean.int.float.long和St ...

  7. android 获取电流参数,Android编程实现添加低电流提醒功能的方法

    本文实例讲述了Android编程实现添加低电流提醒功能的方法.分享给大家供大家参考,具体如下: 特殊需求,检测电流是否正常. 监听如下广播: Intent.ACTION_BATTERY_CHANGED ...

  8. android new date参数,Android向Rest服务Post数据遇到的Date类型数据问题

    今天在Android端向Rest服务Post数据时,总是不成功,查了很多资料,才知道Rest端将json串反序列化时,需要的时间格式必须是UTC类型,及Date(12345678+0800)格式. A ...

  9. android bundle传递参数,android – 使用bundle将数据从一个活动传递...

    我目前正在尝试通过REST API调用获取数据,解析它以获取我需要的信息,然后将该信息传递给新活动.我正在使用loopj.com中的异步HTTP客户端作为REST客户端,然后分别使用以下代码将onCl ...

  10. android log.d 参数,Android log 机制 - logd 总览

    Android 早期版本使用的是一个 log 驱动,后来逐渐使用 logd 进程替代(具体哪个版本我就没有去探究了,至少在 Android 8.0 里,log 驱动已经被移除).原有 log 驱动负责 ...

最新文章

  1. Nginx源代码分析 - 日志处理
  2. 三星r750美版刷Android,这是才是全面派 三星space monitor详解
  3. boost::math模块使用 Brent 方法求函数最小值的示例
  4. Production Hair Rendering in RenderMan
  5. 在sublime text里阅读ABAP源代码的一些例子
  6. 如何查看其他人的ABAP authorization check log
  7. JSON指针:JSON-P 1.1概述系列
  8. Safari 神器,手机平板都能用,我们找到了 14 个超实用浏览器插件
  9. 智芯传感压力传感器在咖啡机中的应用
  10. ps切图技巧、基础工具,使用方法总结
  11. Unity 3D模型展示之模型透明效果
  12. 数据链路层的主要功能与服务
  13. Android获取当前连接的wifi名称
  14. 这些愚蠢的事 数据中心管理中要避免
  15. 变分推断(Variational Inference)解析
  16. python如何导入包
  17. 批量修改文件后缀名 文件扩展名
  18. 三菱fx2nPLC自学笔记01
  19. 原生JS总结-- JS 绑定点击事件
  20. Esri携“新一代Web GIS”亮相中国地理信息产业大会

热门文章

  1. 如何使用 JavaScript 快速构建一个二维码生成器
  2. springboot整合lua脚本
  3. php 判断 小米 手机浏览器,网信办宣布整治手机浏览器 华为、QQ、小米等先查
  4. 判断输入的字符与已知字符相等_你会输入带圈字符吗?
  5. 网格交易法:数学+传统智慧战胜华尔街
  6. JS实现文字转语音播放
  7. [网络安全自学篇] 四.实验吧CTF实战之WEB渗透和隐写术解密
  8. Android中tcp和udp的区别,tcp和udp使用总结
  9. 空号筛选接口的应用场景
  10. 三菱伺服驱动器MR-JE CN3号串口线连接