库地址:https://github.com/yndongyong/multiitemview/tree/ontomany_0.0.3
作用:简化adapter中涉及多种ItemView布局的写法,使用对象池存放布局对象(ItemViewProvider),每一个布局委托一个ItemViewProvider,并在其中封装布局与对象绑定相关的逻辑,简化Adapter。
特性
- 极少的类文件
- 简化Adapter的写法,直接使用SimpleAdapter
- 支持多种布局类型,扩展方便
- 每一种布局相关逻辑均写在对应的委托类中
- 支持一种数据类型对应多种布局
主要涉及的类
SimpleAdapter
继承RecylerView的adapter,简化多类型Item的Adapter写法。
ItemViewProvider
针对每一种布局Item的委托类,onCreateViewHolder和onBindViewHolder都由其委托,在其中完成布局的解析和对象的绑定和该布局相关的逻辑,向外暴露两个方法,一个是返回布局id,一个用于ViewHolder和实体对象的绑定。
int getLayoutId()//布局文件id
void onBindViewHolder(SimpleViewHolder holder, T entity);//绑定UI和值
Items
用于存放数据集
实现思想
- 使用一个SparseArray来保存viewType(即是getItemViewType的返回值)和ItemViewProvider的对应关系
- 使用一个SparseArray来保存viewType和Model(实体类型)的对应关系
对应关系举例如下表所示:
viewType | Model | ItemViewProvider |
---|---|---|
0 | Category | CategoryStyle1ItemViewProvider |
1 | News | NewsItemViewProvider |
2 | Category | CategoryStyle2ItemViewProvider |
Adapter的getItemViewType方法的思路举例如下:
对应的实体类型是News,先找到他的viewType,为1,在通过viewType找到对应的ItemViewProvider,对应的ItemViewProvider只有一个,getItemViewType则立即放回ViewType
对应的实体类型是Category,先找到他的viewType为0,2,再通过viewType找到的对应的ItemViewViewProvider为多个,最终通过ItemViewProvider的accept方法判断由哪个具体的ItemViewViewProvider处理,最中返回其viewType的值。
用法
//准备数据
items.add("头部1 -- type1");
items.add(new CategoryEntry("http://pic.58pic.com/58pic/14/27/45/71r58PICmDM_1024.jpg", "风景图片1"));
items.add(new CategoryEntry("http://img0.imgtn.bdimg.com/it/u=1610953019,3012342313&fm=214&gp=0.jpg", "风景图片2"));
items.add("头部2 -- type2");
items.add(new CategoryEntry("http://pic.58pic.com/58pic/14/27/45/71r58PICmDM_1024.jpg", "风景图片4", 2));
items.add(new CategoryEntry("http://img0.imgtn.bdimg.com/it/u=1610953019,3012342313&fm=214&gp=0.jpg", "风景图片5", 2));
multiTypeAdapter = SimpleAdapter.create(this)
.addNewData(items)
.register(new HeaderItemViewProvider())
.register(new Category1EntryItemViewProvider())
.register(new Category2EntryItemViewProvider())
.register(new Category3EntryItemViewProvider())
.attachToRecyclerView(rv_list);
效果图中一共实现了4中布局类型: