>最近寫了個Android開源庫「[BaseRecyclerViewAdapterHelper](http://blog.csdn.net/cym492224103/article/details/51171802)」集成了很多常見需求的解決方案,希望大家多多star哦~!
#效果如何?


#如何使用?
##多個不同布局
```
public class MultipleItemAdapter extends BaseQuickAdapter<String> {
private final int TEXT_TYPE = 1;
private int mTextLayoutResId;
public MultipleItemAdapter(Context context, List data, int... layoutResId) {
super(context, layoutResId[0], data);
mTextLayoutResId = layoutResId[1];
}
@Override
protected int getDefItemViewType(int position) {
if (position % 2 == 0)
return TEXT_TYPE;
return super.getDefItemViewType(position);
}
@Override
protected BaseViewHolder onCreateDefViewHolder(ViewGroup parent, int viewType) {
if (viewType == TEXT_TYPE)
return new TextViewHolder(getItemView(mTextLayoutResId, parent));
return super.onCreateDefViewHolder(parent, viewType);
}
@Override
protected void onBindDefViewHolder(BaseViewHolder holder, String item) {
if (holder instanceof TextViewHolder)
holder.setText(R.id.tv, item);
}
@Override
protected void convert(BaseViewHolder helper, String item) {
helper.setImageUrl(R.id.iv, item);
}
public class TextViewHolder extends BaseViewHolder {
public TextViewHolder(View itemView) {
super(itemView.getContext(), itemView);
}
}
}
```
##添加頭部尾部
```
mQuickAdapter.addHeaderView(getView());
mQuickAdapter.addFooterView(getView());
```
#原理分析
>如果需要定義多個不同類型的布局,需要知道以下幾點:
- 重寫getItemViewType()方法,根據需求規則給出不同的type值。
- 在onCreateViewHolder()方法里面根據不同的type來創建不同的ViewHolder
- 在onBindViewHolder()里面根據不同holder的類型來賦予相對于的數據
- 如果有額外布局(如:頭部尾部)需要修改getItemCount()方法的返回數量
##多個不同的布局的實現(三部曲)
1.重寫了```getDefItemViewType()```方法,其實也就是父類的```getItemViewType()```里面的方法,如上所說,根據頁面需求,做出規則,因為上面的UI是一個TextView一個ImageView交替的來,所以就寫了個這樣規則的 ```if (position % 2 == 0)```保證他們交替著顯示。
2.type搞定了,接下來就是調用```onCreateDefViewHolder()```了,根據上面的type來創建不同的ViewHolder,
3.然后再接下來調用```onBindDefViewHolder()```,根據上面創建的ViewHolder的類型不同來進行相應的賦值。
##添加頭部和尾部(額外布局)
在上面的基礎之上再重寫```getItemCount()```在原本數據量上加上根據額外布局的數量,代碼如下
```
@Override
public int getItemCount() {
int i = mNextLoadEnable ? 1 : 0;
return mData.size() + i + getHeaderViewsCount() + getFooterViewsCount();
}
```
注意:**如果是添加頭部**
那就必須在原```onBindViewHolder()```里面position-頭部數量,因為不減去的話,那么數據就會從第二條開始遍歷,所以要注意!
```
int index = position - getHeaderViewsCount();
convert(baseViewHolder, mData.get(index));
```
##意外收獲

**國際友人的加盟!**
>每次收獲一點點,后續還會擴展更多功能,供大家使用及學習「[BaseRecyclerViewAdapterHelper](http://blog.csdn.net/cym492224103/article/details/51171802)」。