天天看点

YCBaseAdapter封装控件

1.关于需求介绍

1.1 需求有这些

1.2 封装理念

2.简单封装【V1.0版本】

2.1 封装简单的ViewHolder

2.2 封装简单RecyclerView.Adapter

2.3 如何使用通用adapter

2.4 如何使布局多样化

做法

原理

a.定义一个接口,判断返回数据类型

b.修改封装adapter中getItemViewType中代码

c.修改adapter,实现自定义接口

d.在Activity中设置参数location【定义类型参数】

3.简单封装困境

3.1 遇到问题与困境

3.2 用之前封装类实现多种类型布局,出现的弊端

4.关于复杂界面封装

4.1 具体可以看YCRefreshView

<a href="http://www.jianshu.com/p/53017c3fc75d">博客大汇总,持续更新目录说明,记录所有开源项目和博客</a>

RecycleView可以满足诸多功能,封装公用的adapter,提高编程效率

数据的绑定,刷新

多种不同类型的数据绑定

优雅添加头布局或者底布局

增加onItemClickListener , onItenLongClickListener

支持加载相应type错误页面,无数据页面

支持集合set,add,remove,clear等操作刷新

构造一个通用的Adapter模版,避免每添加一个列表就要写一个Adapter,避免写Adapter中的大量重复代码

高内聚,低耦合,扩展方便

通过组装的方式来构建Adapter,将每一种(ViewType不同的)Item抽象成一个单独组件,Adapter 就是一个壳,我们只需要向Adapter中添加Item就行,这样做的好处就是减少耦合,去掉一种item 或者添加一种item对于列表是没有任何影响的

首先,继承 RecyclerView.ViewHolder 实现一个通用的 ViewHolder当中,使用 SparseArray 来存放 View 以减少 findViewById 的次数,SparseArray 比 HashMap 更省内存,在某些条件下性能会更好,不过只能存储 key 为 int 类型的数据,正好用来存放资源ID

因为列表项中一般都是使用 TextView,ImageView 等控件,所以这里提供控件的操作方法。此外,为了监听列表项单击和双击事件,这里再来自定义一个接口 onItemCommonClickListener ,用于点击事件回调

因为不知道要使用到的数据类型是哪一种,也为了更好的适配各种数据类型,所以这里需要用到泛型当中,onBindViewHolder(CommonViewHolder holder, int position) 需要我们自己来操作,所以这里再来声明一个抽象方法 bindData(CommonViewHolder holder, T data) ,由子类来负责实现绑定操作

添加简单的设置数据,清理数据,移除数据的方法

需要先来继承 XXXAdapter ,只需要实现一个方法即可,看起来简洁多了吧。代码中声明了两个构造函数,根据是否需要用到点击事件监听来选择

抽取的adapter已经可以为我们节省很多代码了,免去了一些重复性操作。但是如果list列表有多种类型,比如像聊天界面,有聊天文字,图片,文件,红点等多种不同的布局。那么添加使用不同布局的功能十分重要。

做法:

复写getItemViewType,根据我们的bean去返回不同的类型

onCreateViewHolder中根据itemView去生成不同的ViewHolder

定义一个接口,判断返回数据类型 需要有一个方法来判断哪种数据类型需要使用哪种布局,所以再来定义一个接口,getLayoutId() 用于返会布局文件ID

修改 XXXAdapter。如果 multiTypeSupport 不为 null,意思就是要使用到不同的布局文件了,则调用 getLayoutId() 方法,将其返回值作为 ItemViewType

修改Adapter 类,实现 MultiTypeSupport 接口,根据 T 对象的 location 字段的值,来决定返回哪个布局文件的ID

前面,我们可以简单实现不同布局类型的。但是大多数的App首页都是比较复杂的,比如一个社交APP的首页,包含Banner区、广告区、文本内容、图片内容、视频内容等等。RecyclerView 可以用ViewType 来区分不同的item,也可以满足需求 ,但还是存在一些问题。

0,如果type的部分实体类参数不同,如何传递setData。即使合并了实体类,但是维护起来十分困难。

1,在item过多逻辑复杂列表界面,Adapter里面的代码量庞大,逻辑复杂,后期难以维护

2,每次增加一个列表都需要增加一个Adapter,重复搬砖,效率低下。

0.传递进来的实体类只能是一种,如果处理多种类型的参数不相同,那么合并实体类容易出问题

1.下面这样就是我们通常写一个多Item列表的方法,根据不同的ViewType 处理不同的item,如果逻辑复杂,这个类的代码量是很庞大的。如果版本迭代添加新的需求,修改代码很麻烦,后期维护困难。

**自定义支持上拉加载更多,下拉刷新,支持自由切换状态【加载中,加载成功,加载失败,没网络等状态】的控件,拓展功能[支持长按拖拽,侧滑删除]可以选择性添加

。具体使用方法,可以直接参考demo。**

轻量级侧滑删除菜单,支持recyclerView,listView,直接嵌套item布局即可使用,整个侧滑菜单思路是:跟随手势将item向左滑动

该库已经用到了实际开发项目中,会持续更新并且修改bug。如果觉得可以,可以star一下,多谢支持!

感谢前辈大神们案例及开源分享精神。

一行代码集成:compile 'org.yczbj:YCRefreshViewLib:2.4'