项目中用到的最多的元素就是列表,在android中目前最流行了的当属RecylerView了。项目中也涉及到很多RecylerView替换Listview的场景。看过比较多对adapter封装的文章,总有些不太简洁。所以本文将介绍自己封装的高度解耦Adapter和viewholder。帮你快速高效生成一个万能列表。
理念
- 构造一个通用的Adapter,避免一个列表一个适配器,避免增加(viewType)item列表就要对Adapter进行修改。
- 将每个Item抽象成独立组件,每个独立组件可在使用适配器前任意位置注册,完全数据驱动样式
- 支持多数据model和多样式一一对应
- 高内聚低耦合
思路
- 抽象数据model,每个数据model实现抽象接口IRvSmartCell。
- 封装Adapter的getItemViewType,实现model中type和viewType对应
- 封装万能ViewHolder,通过接口桥接代理ViewHolder的绑定和解绑
- 封装Adapter的onCreateViewHolder和onBindViewHolder
- 样式仓库,注册列表cell的实现
实现
- model接口的定义
/**
* 万能适配器的model接口
*/
public interface IRvSmartCell {
/**
*
* @return 返回唯一的itemType
*/
String getType();
}
/**
* 一种model的默认实现
*/
public class RvSmartBaseCell implements IRvSmartCell {
protected String itemType;
public RvSmartBaseCell(String itemType) {
this.itemType = itemType;
}
@Override
public String getType() {
return itemType;
}
}
- 封装Adapter的getItemViewType
@Override
public int getItemViewType(int position) {
T data = mDataList.get(position);
if (data == null)
return -1;
// we should use getType()
String typeKey = data.getType();
if (!mStrKeys.containsKey(typeKey)) {
int newType = mTypeId.getAndIncrement();
mStrKeys.put(typeKey, newType);
mId2Types.put(newType, data.getType());
}
return mStrKeys.get(typeKey).intValue();
}
- 封装万能ViewHolder
public class RvSmartHolder