前言
上面的这篇文章是之前写的,里面发现有很多不好用地方,也学到些新姿势,改动了许多地方。下面来看看详细的介绍:
要点:
1.可以通过后台控制Item的展示.
2.TreeRecyclerAdapter,可以展开,折叠.多级展示
3.adapter可以使用装饰者模式进行扩展.支持EmptyAdapter.可以添加headview和footview
4.item的样式可以编写文档,type与Class进行对应,实现后台控置,相同Item复用.
思路:(包含第一篇的思路)
1.adapter应该只需要关心List datas 的内容
2.把每个item看成独立的个体. 布局样式,每行所占比,onbindViewHolder由各个item实现。
3.每一个item应该只关心自己的数据和自己的下一级的数据,不会去关心上上级,下下级
4.展开的实现,点击时item把子数据拿出来,然后添加到adapter的datas中,变成同级,因为只会展开自己的下级数据。
5.折叠的实现,拿到下级数据(可以理解因为一个文件夹下文件),然后从adapter的datas中删除这些数据。
6.后台控制可以通过初始化注册的方法,将Item的Class注册.保存到集合里
7.后台返回字段,获取对应class文件,通过Class.newInstance()方法构建实例.
8.将ViewHolder与Adapter写成通用的,不需要再写多个Adatper与ViewHolder,只需要写多个Baseitem.与BaseItamData(JavaBean).
目录介绍
+ 1.Adapter
* Wapper------扩展的wapper,
* EmptyWapper --------当无数据时显示页面.
* HeaderAndFootWapper --------添加头部view和尾部view
- BaseRecyclerAdapter --------封装的Adatper基类
- ItemManager --------接口,管理Adatper刷新,增删操作
- TreeRecyclerAdapter ----多级列表,树形结构的adapter
- TreeRecyclerViewType ----多级列表的显示样式,枚举
- ViewHolder----封装的通用viewHodler
* 2.base
BaseItem ------item的封装
BaseItemData-----item的数据要求.javabean需要继承该类.
* 3.factory
ItemConfig ----添加item的class,配置样式
Itemfactory----通过class生成BaseItem的工厂类
* 4.view
TreeItem ----树形列表的子item
TreeItemGroup ----树形列表的父item
TreeParent---TreeItemGroup 实现该接口
TreeSelectItemGroup---可以选中子item的TreeItemGroup. demo:见购物页面
来张丑丑的图:
下面贴出部分代码:
(一).BaseRecyclerAdapter :
/**
* 普通BaseRecyclerAdapter,itme无父子关系.
* 限定泛型为BaseItem的子类.
* 通过BaseItem去处理ViewHolder
*/
public class BaseRecyclerAdapter extends
RecyclerView.Adapter {
private List mDatas;//展示数据
private ItemManager mItemManager;
private CheckItem mCheckItem;
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//看源码,这里的parent就是Recyclerview,所以不会为null.可以通过它拿到context
return ViewHolder.createViewHolder(parent.getContext(), parent, viewType);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
T t = getDatas().get(position);
//检查是否绑定了ItemManage,因为item需要通过ItemManage告诉adapter刷新,增删
checkItemManage(t);
//具体onBindViewHolder放到item里面去实现
t.onBindViewHolder(holder);
//实现点击事件
onBindViewHolderClick(holder);
}
/**
* 实现item的点击事件
*
* @param holder 绑定点击事件的ViewHolder
*/
public void onBindViewHolderClick(final ViewHolder holder) {
//判断当前holder是否已经设置了点击事件
if (!holder.itemView.hasOnClickListeners()) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获得holder的position
int layoutPosition = holder.getLayoutPosition();
//检查position是否可以点击
if (getCheckItem().checkPosition(layoutPosition)) {
//检查并得到真实的position
int itemPosition = getCheckItem().getAfterCheckingPosition(layou