## DataBinding 篇:
### 使用必读:
`BaseBindingAdapter`利用DataBinding提供的动态绑定技术,使用`BR.data`封装数据、`BR.itemP`封装点击事件。所以对`layout`有以下要求:
* layout中 数据name起名**data**
* layout中 点击事件Presenter起名 **itemP**
如:
```
```
### 1 单Item列表
#### 效果如图:
顺带演示了BaseBindingAdapter封装的一些增删功能。

#### 用法:
和其他BaseAdapter用法一致:
* 构造函数只需要传入context,datas,layout
```
mAdapter = new BaseBindingAdapter(this, mDatas, R.layout.item_db_single);
```
如果需要设置点击事件(点击事件设置所有类型都一样,下不赘述):
```
//★ 设置Item点击事件
mAdapter.setItemPresenter(new SingleItemPresenter());
```
```
/**
* ★ Item点击事件P
*/
public class SingleItemPresenter {
public void onItemClick(DBSingleBean data) {
data.setName("修改之后立刻见效");
}
}
```
#### 特殊需求:
如果有特殊需求,可传入两个泛型,重写onBindViewHolder搞事情:
```
// ★泛型D:是Bean类型,如果有就传。 泛型B:是对应的xml Layout的Binding类
mAdapter = new BaseBindingAdapter(this, mDatas, R.layout.item_db_single) {
@Override
public void onBindViewHolder(BaseBindingVH holder, int position) {
//★super一定不要删除
super.onBindViewHolder(holder, position);
//如果有特殊需求,可传入两个泛型,重写onBindViewHolder搞事情。
ItemDbSingleBinding binding = holder.getBinding();
DBSingleBean data = mDatas.get(position);
}
};
```
### 2 多Item同种数据类型列表
一般是像IM那种列表,虽然Item不同,但是数据结构是同一个。用法,**一句话**~
#### 效果如图:

#### 用法:
* 数据结构(JavaBean)需实现`IBaseMulInterface`接口,根据情况返回不同的layout。
* 构造函数只需要传入context,datas.
```
mAdapter = new BaseMulTypeBindingAdapter(this, mDatas);
```
```
/**
* 介绍:多种type单数据结构Bean
* 作者:zhangxutong
* 邮箱:mcxtzhang@163.com
* 主页:http://blog.csdn.net/zxt0601
* 时间: 2016/12/13.
*/
public class MulTypeSingleBean extends BaseObservable implements IBaseMulInterface {
private String avatar;
private String name;
private boolean receive;
@Override
public int getItemLayoutId() {
if (isReceive()) {
return R.layout.item_db_mul_1;
} else {
return R.layout.item_db_mul_2;
}
}
}
```
#### 特殊需求:
如果有特殊需求,可传入数据结构的泛型,避免强转,重写`onBindViewHolder()`方法,但是Binding类 不可避免的需要强转了:
```
mAdapter = new BaseMulTypeBindingAdapter(this, mDatas) {
@Override
public void onBindViewHolder(BaseBindingVH holder, int position) {
super.onBindViewHolder(holder, position);
//如果有特殊需求,可传入数据结构的泛型,避免强转
MulTypeSingleBean data = mDatas.get(position);
//Binding类 不可避免的需要强转了
ViewDataBinding binding = holder.getBinding();
switch (data.getItemLayoutId()) {
case R.layout.item_db_mul_1:
ItemDbMul1Binding itemDbMul1Binding = (ItemDbMul1Binding) binding;
break;
case R.layout.item_db_mul_2:
ItemDbMul2Binding itemDbMul2Binding = (ItemDbMul2Binding) binding;
break;
}
}
};
```
### 3 多Item、多种数据类型列表
各大APP首页,Banner、列表、推荐混排,数据结构肯定不同,但是依然只要**一句代码**搞定Adapter!
#### 效果如图:

#### 用法:
* 数据结构(JavaBean)需**分别**实现`IBaseMulInterface`接口,返回数据结构对应的layout。
* 构造函数只需要传入context,datas.
```
mAdapter = new BaseMulTypeBindingAdapter(this, mDatas);
```
```
public class MulTypeMulBean1 extends BaseObservable implements IBaseMulInterface {
private String avatar;
private String name;
@Override
public int getItemLayoutId() {
return R.layout.item_db_mulbean_1;
}
}
```
```
public class MulTypeMulBean2 extends BaseObservable implements IBaseMulInterface {
private String background;
@Override
public int getItemLayoutId() {
return R.layout.item_db_mulbean_2;
}
}
```
#### 特殊需求:
如果有特殊需求,重写`onBindViewHolder()`方法,但是数据结构 和 Binding类 都不可避免的需要强转了:
```
mAdapter = new BaseMulTypeBindingAdapter(this, mDatas) {
@Override
public void onBindViewHolder(BaseBindingVH holder, int position) {
super.onBindViewHolder(holder, position);
//如果有特殊需求 重写onBindViewHolder方法
// 数据结构 和 Binding类 都不可避免的需要强转了
ViewDataBinding binding = holder.getBinding();
switch (getItemViewType(position)) {
case R.layout.item_db_mul_1:
ItemDbMul1Binding itemDbMul1Binding = (ItemDbMul1Binding) binding;
MulTypeMulBean1 data1 = (MulTypeMulBean1) mDatas.get(position);
break;
case R.layout.item_db_mul_2:
ItemDbMul2Binding itemDbMul2Binding = (ItemDbMul2Binding) binding;
MulTypeMulBean2 data2 = (MulTypeMulBean2) mDatas.get(position);
break;
}
}
};
```
### 4 不能忘了上文的ViewGroup呀
对上文封装的ViewGroup类型Adapter也提供DataBinding的支持。
#### 效果如图:
当然还是流式布局搭配[史上集成最叼侧滑菜单控件]。

#### 用法:
和上文[快速开发偷懒必备(一)]一样,只是Adapter换成`SingleBindingAdapter`
```
mAdapter = new SingleBindingAdapter<>(this, mDatas = iniDatas(), R.layout.item_db_flow_swipe);
```
如果需要设置点击事件:
```
mAdapter.setItemPresenter(new ItemDelPresenter());
```