本篇文章已授權(quán)微信公眾號(hào) guolin_blog (郭霖)獨(dú)家發(fā)布
轉(zhuǎn)載請(qǐng)標(biāo)明出處:
http://www.reibang.com/p/fe883d36a8ec
本文出自:【張旭童的簡(jiǎn)書(shū)】 (http://www.reibang.com/users/8e91ff99b072/latest_articles)
代碼傳送門:喜歡的話,隨手點(diǎn)個(gè)star聚蝶。多謝
https://github.com/mcxtzhang/all-base-adapter
概述
在前文快速開(kāi)發(fā)偷懶必備(一)中咧纠,我們利用Adapter模式封裝了一個(gè)庫(kù),能快速為任意ViewGroup添加子View丛肢。
有如下特點(diǎn):
- 快速簡(jiǎn)單使用
- 支持任意ViewGroup
- 無(wú)耦合
- 無(wú)侵入性
- Item支持多種類型
在庫(kù)中V1.1.0版本,我也順手加入了RecyclerView剿干、ListView蜂怎、GridView的通用Adapter功能,庫(kù)地址在這里置尔。
現(xiàn)在V1.2.0版本發(fā)布杠步,我又加入了我最近超愛(ài)的一個(gè)技術(shù),DataBinding榜轿。
封裝了一套一行代碼實(shí)現(xiàn)花式列表的Adapter幽歼。
即利用DataBinding實(shí)現(xiàn)RecyclerView中快速使用的Adapter。
以后不管寫(xiě)多種type還是單type的列表谬盐,利用DataBinding 和本庫(kù)甸私,都只需要一行代碼!
這里也算是安利DataBinding吧飞傀,真的超好用皇型。還沒(méi)使用的朋友們,在看到本文可以如此簡(jiǎn)單寫(xiě)花式列表后砸烦,建議去學(xué)習(xí)一下犀被。
先看用法吧,簡(jiǎn)單粗暴到?jīng)]朋友外冀。
用法
使用必讀:
BaseBindingAdapter
利用DataBinding提供的動(dòng)態(tài)綁定技術(shù),使用BR.data
封裝數(shù)據(jù)、BR.itemP
封裝點(diǎn)擊事件掀泳。所以對(duì)layout
有以下要求:
- layout中 數(shù)據(jù)name起名data
- layout中 點(diǎn)擊事件Presenter起名 itemP
如:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="itemP"
type="mcxtzhang.commonviewgroupadapter.databinding.rv.single.DBSingleActivity.SingleItemPresenter"/>
<variable
name="data"
type="mcxtzhang.commonviewgroupadapter.databinding.rv.single.DBSingleBean"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="1dp"
android:background="@color/colorAccent"
android:onClick="@{v->itemP.onItemClick(data)}"
android:orientation="horizontal">
<ImageView
android:id="@+id/ivAvatar"
android:layout_width="200dp"
android:layout_height="200dp"
app:netUrl="@{data.avatar}"
tools:src="@mipmap/ic_launcher"/>
<TextView
android:id="@+id/tvName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{data.name}"
tools:text="測(cè)試多種"/>
</LinearLayout>
</layout>
1 單Item列表
效果如圖:
順帶演示了BaseBindingAdapter封裝的一些增刪功能雪隧。
用法:
和其他BaseAdapter用法一致:
- 構(gòu)造函數(shù)只需要傳入context西轩,datas,layout
mAdapter = new BaseBindingAdapter(this, mDatas, R.layout.item_db_single);
好了脑沿,列表已經(jīng)出來(lái)了藕畔。我不騙你,就這一句話庄拇。
如果需要設(shè)置點(diǎn)擊事件(點(diǎn)擊事件設(shè)置所有類型都一樣注服,下不贅述):
//★ 設(shè)置Item點(diǎn)擊事件
mAdapter.setItemPresenter(new SingleItemPresenter());
/**
* ★ Item點(diǎn)擊事件P
*/
public class SingleItemPresenter {
public void onItemClick(DBSingleBean data) {
data.setName("修改之后立刻見(jiàn)效");
}
}
特殊需求:
如果有特殊需求,可傳入兩個(gè)泛型措近,重寫(xiě)onBindViewHolder搞事情:
// ★泛型D:是Bean類型溶弟,如果有就傳。 泛型B:是對(duì)應(yīng)的xml Layout的Binding類
mAdapter = new BaseBindingAdapter<DBSingleBean, ItemDbSingleBinding>(this, mDatas, R.layout.item_db_single) {
@Override
public void onBindViewHolder(BaseBindingVH<ItemDbSingleBinding> holder, int position) {
//★super一定不要?jiǎng)h除
super.onBindViewHolder(holder, position);
//如果有特殊需求瞭郑,可傳入兩個(gè)泛型辜御,重寫(xiě)onBindViewHolder搞事情。
ItemDbSingleBinding binding = holder.getBinding();
DBSingleBean data = mDatas.get(position);
}
};
2 多Item同種數(shù)據(jù)類型列表
一般是像IM那種列表屈张,雖然Item不同擒权,但是數(shù)據(jù)結(jié)構(gòu)是同一個(gè)。用法阁谆,一句話~
效果如圖:
用法:
- 數(shù)據(jù)結(jié)構(gòu)(JavaBean)需實(shí)現(xiàn)
IBaseMulInterface
接口,根據(jù)情況返回不同的layout碳抄。 - 構(gòu)造函數(shù)只需要傳入context,datas.
mAdapter = new BaseMulTypeBindingAdapter(this, mDatas);
復(fù)雜列表依然一句話场绿。
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;
}
}
}
特殊需求:
如果有特殊需求剖效,可傳入數(shù)據(jù)結(jié)構(gòu)的泛型,避免強(qiáng)轉(zhuǎn)裳凸,重寫(xiě)onBindViewHolder()
方法,但是Binding類 不可避免的需要強(qiáng)轉(zhuǎn)了:
mAdapter = new BaseMulTypeBindingAdapter<MulTypeSingleBean>(this, mDatas) {
@Override
public void onBindViewHolder(BaseBindingVH<ViewDataBinding> holder, int position) {
super.onBindViewHolder(holder, position);
//如果有特殊需求贱鄙,可傳入數(shù)據(jù)結(jié)構(gòu)的泛型,避免強(qiáng)轉(zhuǎn)
MulTypeSingleBean data = mDatas.get(position);
//Binding類 不可避免的需要強(qiáng)轉(zhuǎn)了
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姨谷、多種數(shù)據(jù)類型列表
各大APP首頁(yè)逗宁,Banner、列表梦湘、推薦混排瞎颗,數(shù)據(jù)結(jié)構(gòu)肯定不同,但是依然只要一句代碼搞定Adapter捌议!
效果如圖:
用法:
- 數(shù)據(jù)結(jié)構(gòu)(JavaBean)需分別實(shí)現(xiàn)
IBaseMulInterface
接口,返回?cái)?shù)據(jù)結(jié)構(gòu)對(duì)應(yīng)的layout瓣颅。 - 構(gòu)造函數(shù)只需要傳入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;
}
}
特殊需求:
如果有特殊需求,重寫(xiě)onBindViewHolder()
方法,但是數(shù)據(jù)結(jié)構(gòu) 和 Binding類 都不可避免的需要強(qiáng)轉(zhuǎn)了:
mAdapter = new BaseMulTypeBindingAdapter(this, mDatas) {
@Override
public void onBindViewHolder(BaseBindingVH holder, int position) {
super.onBindViewHolder(holder, position);
//如果有特殊需求 重寫(xiě)onBindViewHolder方法
// 數(shù)據(jù)結(jié)構(gòu) 和 Binding類 都不可避免的需要強(qiáng)轉(zhuǎn)了
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呀
對(duì)上文封裝的ViewGroup類型Adapter也提供DataBinding的支持宫补。
效果如圖:
當(dāng)然還是流式布局搭配史上集成最叼側(cè)滑菜單控件檬姥。
用法:
和上文快速開(kāi)發(fā)偷懶必備(一)一樣曾我,只是Adapter換成SingleBindingAdapter
mAdapter = new SingleBindingAdapter<>(this, mDatas = iniDatas(), R.layout.item_db_flow_swipe);
如果需要設(shè)置點(diǎn)擊事件:
mAdapter.setItemPresenter(new ItemDelPresenter());
設(shè)計(jì)思路與實(shí)現(xiàn)
使用起來(lái)如此爽快,其實(shí)寫(xiě)起來(lái)也很簡(jiǎn)單健民。
注意類BaseBindingAdapter
和BaseMulTypeBindingAdapter
都不是abstract
的抒巢,這說(shuō)明我們不需要重寫(xiě)任何方法。
利用DataBinding秉犹,我們?cè)贐asexxxAdapter內(nèi)部和xml分別做View的創(chuàng)建和數(shù)據(jù)綁定的工作蛉谜。
UML類圖
先簡(jiǎn)要概括
-
BaseBindingVH
繼承自RecyclerView.ViewHolder
,持有T extends ViewDataBinding
類型的mBinding
變量崇堵。利用ViewDataBinding
我們將不用再寫(xiě)任何ViewHolder
型诚。 -
BaseBindingAdapter
,繼承自RecyclerView.Adapter
,依賴BaseBindingVH
筑辨,onCreateViewHolder(ViewGroup parent, int viewType)
方法返回BaseBindingVH
作為ViewHolder
俺驶。
內(nèi)部持有三個(gè)重要變量:數(shù)據(jù)對(duì)應(yīng)layout,數(shù)據(jù)集棍辕,Item點(diǎn)擊事件處理類暮现。數(shù)據(jù)對(duì)應(yīng)layout會(huì)在onCreateViewHolder(ViewGroup parent, int viewType)
用到。剩下兩個(gè)變量在onBindViewHolder()
用到楚昭。對(duì)外暴漏setItemPresenter(Object itemPresenter)
供設(shè)置點(diǎn)擊事件處理類栖袋。 -
IBaseMulInterface
接口和快速開(kāi)發(fā)偷懶必備(一)提到的一樣,返回某個(gè)數(shù)據(jù)結(jié)構(gòu)對(duì)應(yīng)的layout抚太,除此之外塘幅,本文還有一個(gè)十分tricky之處,利用返回的R.layout.itemxxxx
作為ItemViewType
尿贫,在BaseMulTypeBindingAdapter
會(huì)用到电媳。 -
BaseMulTypeBindingAdapter
繼承自BaseBindingAdapter
,但是它不再關(guān)心mLayoutId
變量,它利用IBaseMulInterface
接口返回的R.layout.itemxxxx
作為ItemViewType
庆亡,這樣在onCreateViewHolder(ViewGroup parent, int viewType)
的時(shí)候匾乓,就可以直接用viewType
構(gòu)造出ItemView
。不再依賴mLayoutId
變量又谋。這是一個(gè)我很得意的設(shè)計(jì)拼缝,我在優(yōu)雅為RecyclerView增加HeaderView一文中,也曾用過(guò)這個(gè)方法彰亥。
BaseBindingVH
BaseBindingVH
算是一個(gè)核心類咧七,但是又十分簡(jiǎn)單。它繼承自RecyclerView.ViewHolder
任斋,持有由泛型傳入的T extends ViewDataBinding
類型的mBinding
變量继阻。
唯一構(gòu)造函數(shù),需要一個(gè)T t
變量,然后調(diào)用super()
傳入t.getRoot()
完成itemView
的賦值瘟檩。同時(shí)對(duì)mBinding
變量賦值犬第。
對(duì)外暴漏getBinding()
返回mBinding
變量。
利用ViewDataBinding
我們將不用再寫(xiě)任何ViewHolder
芒帕。
public class BaseBindingVH<T extends ViewDataBinding> extends RecyclerView.ViewHolder {
protected final T mBinding;
public BaseBindingVH(T t) {
super(t.getRoot());
mBinding = t;
}
public T getBinding() {
return mBinding;
}
}
BaseBindingAdapter
BaseBindingAdapter
,繼承自RecyclerView.Adapter
,依賴BaseBindingVH
丰介,將BaseBindingVH
作為泛型傳給RecyclerView.Adapter
背蟆。
同時(shí)BaseBindingAdapter
本身接受兩個(gè)泛型,<D, B extends ViewDataBinding>
哮幢。
- 泛型沒(méi)有特殊需求可以不傳
- 泛型D:是Bean類型带膀,如果有就傳。
- 泛型B:是對(duì)應(yīng)的xml Layout的Binding類
傳入不傳入泛型的區(qū)別已經(jīng)在第二節(jié)具體用法里進(jìn)行了演示橙垢,不再贅述垛叨。
內(nèi)部持有三個(gè)重要變量:
- 數(shù)據(jù)對(duì)應(yīng)layout
int mLayoutId;
- 數(shù)據(jù)集
List<D> mDatas;
- Item點(diǎn)擊事件處理類。
Object ItemPresenter;
mLayoutId
和mDatas
都由構(gòu)造函數(shù)傳入柜某,沒(méi)啥好說(shuō)的嗽元。
對(duì)外暴漏setItemPresenter(Object itemPresenter)
供設(shè)置點(diǎn)擊事件處理類ItemPresenter
。
ItemPresenter
是Object
類型喂击,這樣才不care你set的Item點(diǎn)擊事件處理類是什么鬼剂癌。
onCreateViewHolder(ViewGroup parent, int viewType)
方法返回BaseBindingVH
作為ViewHolder
。
mLayoutId
會(huì)在onCreateViewHolder(ViewGroup parent, int viewType)
用到,再根據(jù)泛型B強(qiáng)轉(zhuǎn)成對(duì)應(yīng)的ViewDataBinding
:
BaseBindingVH<B> holder = new BaseBindingVH<B>((B) DataBindingUtil.inflate(mInfalter, mLayoutId, parent, false));
會(huì)在onBindViewHolder()
方法里翰绊,利用DataBinding動(dòng)態(tài)綁定ViewDataBinding.setVariable(BR.itemP, ItemPresenter);
為每個(gè)Item設(shè)置點(diǎn)擊事件佩谷。
同時(shí),數(shù)據(jù)也是同樣在里面綁定的:setVariable(BR.data, mDatas.get(position))
监嗜。
重點(diǎn)代碼如下:
public class BaseBindingAdapter<D, B extends ViewDataBinding> extends RecyclerView.Adapter<BaseBindingVH<B>> {
protected Context mContext;
protected int mLayoutId;
protected List<D> mDatas;
protected LayoutInflater mInfalter;
//用于設(shè)置Item的事件Presenter
protected Object ItemPresenter;
public BaseBindingAdapter(Context mContext, List mDatas, int mLayoutId) {
this.mContext = mContext;
this.mLayoutId = mLayoutId;
this.mDatas = mDatas;
this.mInfalter = LayoutInflater.from(mContext);
}
@Override
public BaseBindingVH<B> onCreateViewHolder(ViewGroup parent, int viewType) {
BaseBindingVH<B> holder = new BaseBindingVH<B>((B) DataBindingUtil.inflate(mInfalter, mLayoutId, parent, false));
onCreateViewHolder(holder);
return holder;
}
/**
* 如果需要給Vh設(shè)置監(jiān)聽(tīng)器啥的 可以在這里
*
* @param holder
*/
public void onCreateViewHolder(BaseBindingVH<B> holder) {
}
/**
* 子類除了綁定數(shù)據(jù)谐檀,還要設(shè)置監(jiān)聽(tīng)器等其他操作。
* 可以重寫(xiě)這個(gè)方法裁奇,不要?jiǎng)h掉super.onBindViewHolder(holder, position);
*
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(BaseBindingVH<B> holder, int position) {
holder.getBinding().setVariable(BR.data, mDatas.get(position));
holder.getBinding().setVariable(BR.itemP, ItemPresenter);
holder.getBinding().executePendingBindings();
}
/**
* 用于設(shè)置Item的事件Presenter
*
* @param itemPresenter
* @return
*/
public BaseBindingAdapter setItemPresenter(Object itemPresenter) {
ItemPresenter = itemPresenter;
return this;
}
}
BaseBindingAdapter
內(nèi)部也封裝了如下方法桐猬,方便數(shù)據(jù)刷新,增刪(定向刷新)調(diào)用:
/**
* 刷新數(shù)據(jù)框喳,初始化數(shù)據(jù)
*
* @param list
*/
public void setDatas(List<D> list) {
if (this.mDatas != null) {
if (null != list) {
List<D> temp = new ArrayList<D>();
temp.addAll(list);
this.mDatas.clear();
this.mDatas.addAll(temp);
} else {
this.mDatas.clear();
}
} else {
this.mDatas = list;
}
notifyDataSetChanged();
}
/**
* 刪除一條數(shù)據(jù)
* 會(huì)自動(dòng)定向刷新
*
* @param i
*/
public void remove(int i) {
if (null != mDatas && mDatas.size() > i && i > -1) {
mDatas.remove(i);
notifyItemRemoved(i);
}
}
/**
* 添加一條數(shù)據(jù) 至隊(duì)尾
* 會(huì)自動(dòng)定向刷新
*
* @param data
*/
public void add(D data) {
if (data != null && mDatas != null) {
mDatas.add(data);
notifyItemInserted(mDatas.size());
}
}
/**
* 在指定位置添加一條數(shù)據(jù)
* 會(huì)自動(dòng)定向刷新
* <p>
* 如果指定位置越界课幕,則添加在隊(duì)尾
*
* @param position
* @param data
*/
public void add(int position, D data) {
if (data != null && mDatas != null) {
if (mDatas.size() > position && position > -1) {
mDatas.add(position, data);
notifyItemInserted(position);
} else {
add(data);
}
}
}
/**
* 加載更多數(shù)據(jù)
*
* @param list
*/
public void addDatas(List<D> list) {
if (null != list) {
List<D> temp = new ArrayList<D>();
temp.addAll(list);
if (this.mDatas != null) {
this.mDatas.addAll(temp);
} else {
this.mDatas = temp;
}
notifyDataSetChanged();
}
}
IBaseMulInterface接口
來(lái)點(diǎn)簡(jiǎn)單的.
IBaseMulInterface
接口和快速開(kāi)發(fā)偷懶必備(一)提到的一樣,返回某個(gè)數(shù)據(jù)結(jié)構(gòu)對(duì)應(yīng)的layout.
除此之外五垮,本文還有一個(gè)十分tricky之處乍惊,利用返回的R.layout.itemxxxx
作為ItemViewType
,在BaseMulTypeBindingAdapter
會(huì)用到放仗。
因?yàn)椴煌?code>R.layout.itemxxxx對(duì)于RecyclerView來(lái)說(shuō)一定是不同的Item润绎,
BaseMulTypeBindingAdapter
多種ItemType的Base類
BaseMulTypeBindingAdapter
繼承自BaseBindingAdapter
,但是它不再關(guān)心mLayoutId
變量。因此它傳給父類的泛型B就是ViewDataBinding
類本身。解釋如下:
基類的泛型B:不用傳莉撇,因?yàn)槎喾NItemType 肯定Layout長(zhǎng)得不一樣呢蛤,那么Binding類也不一樣,傳入沒(méi)有任何意義
泛型T:多Item多Bean情況可以不傳棍郎。如果只有一種Bean類型其障,可以傳入Bean,實(shí)現(xiàn)IBaseMulInterface接口涂佃。
或者傳入IBaseMulInterface接口励翼,可以拿到 getItemLayoutId(),
但是通過(guò)getItemViewType(int position)辜荠,一樣汽抚。所以多Item多Bean建議不傳。
傳入不傳入泛型的區(qū)別已經(jīng)在第二節(jié)具體用法里進(jìn)行了演示伯病,不再贅述造烁。
getItemViewType()
直接返回 IBaseMulInterface
接口的返回值。
在onCreateViewHolder(ViewGroup parent, int viewType)
的時(shí)候午笛,直接用viewType
構(gòu)建ViewDataBinding
(ItemView
)惭蟋。不再依賴mLayoutId
變量。
這是一個(gè)我很得意的設(shè)計(jì)季研,我在優(yōu)雅為RecyclerView增加HeaderView一文中敞葛,也曾用過(guò)這個(gè)方法添加頭部。
完整代碼如下:
public class BaseMulTypeBindingAdapter<T extends IBaseMulInterface> extends BaseBindingAdapter<T, ViewDataBinding> {
public BaseMulTypeBindingAdapter(Context mContext, List<T> mDatas) {
super(mContext, mDatas);
}
@Override
public int getItemViewType(int position) {
return mDatas.get(position).getItemLayoutId();
}
@Override
public BaseBindingVH<ViewDataBinding> onCreateViewHolder(ViewGroup parent, int viewType) {
BaseBindingVH<ViewDataBinding> holder = new BaseBindingVH<ViewDataBinding>(DataBindingUtil.inflate(mInfalter, viewType, parent, false));
onCreateViewHolder(holder);
return holder;
}
}
ViewGroup Adapter的實(shí)現(xiàn)
單item
繼承SingleAdapter
与涡,增加ItemPresenter
惹谐,在getView()
完成View創(chuàng)建和綁定。
public class SingleBindingAdapter<D, B extends ViewDataBinding> extends SingleAdapter<D> {
//用于設(shè)置Item的事件Presenter
protected Object ItemPresenter;
/**
* 用于設(shè)置Item的事件Presenter
*
* @param itemPresenter
* @return
*/
public SingleBindingAdapter setItemPresenter(Object itemPresenter) {
ItemPresenter = itemPresenter;
return this;
}
public SingleBindingAdapter(Context context, List<D> datas, int itemLayoutId) {
super(context, datas, itemLayoutId);
}
//重寫(xiě)利用DataBinding做
@Override
public View getView(ViewGroup parent, int pos, D data) {
ViewDataBinding binding = DataBindingUtil.inflate(mInflater, mItemLayoutId, parent, false);
View itemView = binding.getRoot();
onBindView(parent, itemView, data, pos);
binding.setVariable(BR.data, data);
binding.setVariable(BR.itemP, ItemPresenter);
return itemView;
}
//空實(shí)現(xiàn)即可驼卖,因?yàn)镈ataBinding的實(shí)現(xiàn)都是在xml里做
@Override
public void onBindView(ViewGroup parent, View itemView, D data, int pos) {
}
}
多Item:
更簡(jiǎn)單了氨肌,繼承SingleBindingAdapter
。重寫(xiě)getView()
即可酌畜。
public class MulTypeBindngAdapter<T extends IMulTypeHelper> extends SingleBindingAdapter<T, ViewDataBinding> {
public MulTypeBindngAdapter(Context context, List<T> datas) {
super(context, datas, -1);
}
//重寫(xiě)利用DataBinding做
@Override
public View getView(ViewGroup parent, int pos, T data) {
ViewDataBinding binding = DataBindingUtil.inflate(mInflater, data.getItemLayoutId(), parent, false);
View itemView = binding.getRoot();
onBindView(parent, itemView, data, pos);
binding.setVariable(BR.data, data);
binding.setVariable(BR.itemP, ItemPresenter);
return itemView;
}
}
總結(jié)
代碼傳送門:喜歡的話怎囚,隨手點(diǎn)個(gè)star。多謝
https://github.com/mcxtzhang/all-base-adapter
本文利用DataBinding
的ViewDataBinding
直接略去寫(xiě)ViewHolder
桥胞。
利用Object
類型的ItemPresenter
恳守,兼容解決了點(diǎn)擊事件的設(shè)置。
最得意的設(shè)計(jì)贩虾,還是利用R.layout.xxxx
這些布局文件int類型的的RID,作為ItemViewType
催烘,一箭雙雕。
DataBinding
很強(qiáng)缎罢,希望大家快點(diǎn)擁抱它伊群。
to do list
- ViewGroup Adapter 考慮加入復(fù)用緩存池
- ViewGroup Adapter 考杉,考慮替換
onBindView()
的ItemView
->通用的ViewHolder
,這樣可以少寫(xiě)一些findViewById()
代碼 整合DataBinding 的通用Adapter入庫(kù)舰始。- 完善 RecyclerView崇棠、ListView的通用Adapter,支持多種ItemViewType丸卷。
- 加入一些自定義ViewGroup入庫(kù)枕稀,例如流式布局,九宮格谜嫉,Banner輪播圖抽莱。
轉(zhuǎn)載請(qǐng)標(biāo)明出處:
http://www.reibang.com/p/fe883d36a8ec
本文出自:【張旭童的簡(jiǎn)書(shū)】 (http://www.reibang.com/users/8e91ff99b072/latest_articles)
代碼傳送門:喜歡的話,隨手點(diǎn)個(gè)star骄恶。多謝
https://github.com/mcxtzhang/all-base-adapter