前言
本文是MultiItem
系列的進(jìn)階文章役听,講解如何利用 DataBinding
改善對(duì)MultiItem
的開發(fā),其中RecyclerView
的Adapter
和ViewHolderManager
都不需要編寫,使用庫(kù)中封裝的基礎(chǔ)類就可以完成業(yè)務(wù)代碼的開發(fā),使你的RecyclerView
代碼更加干凈清爽。
MutliItem
主要解決多類型RecyclerView Adapter問(wèn)題伟叛,在正常使用中做到了Adapter
零編碼,解放了復(fù)雜的Adapter
類脐嫂,提高擴(kuò)展性统刮。
源碼地址
Github地址:https://github.com/free46000/MultiItem,請(qǐng)大家多多關(guān)注账千,更多更新會(huì)首先在GitHub上體現(xiàn)侥蒙,也會(huì)在第一時(shí)間在本平臺(tái)發(fā)布。
系列文章
- MultiItem用法與詳解-優(yōu)雅的實(shí)現(xiàn)多類型
- MultiItem進(jìn)階 實(shí)現(xiàn)Head Foot和加載更多
- MultiItem擴(kuò)展 仿任務(wù)面板 跨多個(gè)RecyclerView的Item拖動(dòng) 支持縮小后拖動(dòng)
效果截圖

用法
開啟數(shù)據(jù)綁定
在build.gradle
開啟DataBinding
:
dataBinding {
enabled = true
}
使用方法
為數(shù)據(jù)源注冊(cè)ViewHolderManager
管理類:
//初始化adapter
BaseItemAdapter adapter = new BaseItemAdapter();
//綁定寫法一(簡(jiǎn)單):直接傳入BR.itemData(VariableId)
adapter.register(TextBean.class, new DataBindViewHolderManager<>(R.layout.item_text_data_bind, BR.itemData));
//綁定寫法二(自由):傳入ItemBindView接口實(shí)例匀奏,可以定制綁定業(yè)務(wù)邏輯
adapter.register(ImageTextBean.class, new DataBindViewHolderManager<>(
R.layout.item_image_text_data_bind, this::onBindViewHolder));
上面代碼中寫法二的實(shí)現(xiàn)我們看到了this::onBindViewHolder
這一行代碼鞭衩,這是使用表達(dá)式后的簡(jiǎn)寫方式,就是實(shí)現(xiàn)了一個(gè)ItemBindView
接口的實(shí)例娃善,onBindViewHolder
方法為接口中具體執(zhí)行的方法:
//將數(shù)據(jù)綁定的視圖中论衍,具體代碼由DataBinding庫(kù)自動(dòng)生成
private void onBindViewHolder(ViewDataBinding dataBinding, Object data) {
//還可以寫一些其他的綁定業(yè)務(wù)邏輯......
dataBinding.setVariable(BR.itemData, data);
}
通過(guò)以上簡(jiǎn)單幾行代碼我們就完成了多類型的RecyclerView
列表的代碼,是不是非常干凈清爽聚磺,其中BaseItemAdapter
和DataBindViewHolderManager
都是MultiItem
庫(kù)中封裝好的基礎(chǔ)類坯台,可以在業(yè)務(wù)代碼中直接使用。
DataBinding:ImageView加載網(wǎng)絡(luò)URL
這里使用了DataBinding
的BindingAdapter
注解瘫寝,可以為xml
定制一些設(shè)值方法蜒蕾,具體使用方式大家可以參考BindingAdapter的官方文檔
Demo
中BindingAdapter
的定制代碼:
/**
* 通過(guò)android:imageUrl可以在xml布局中直接為ImageView設(shè)置url地址
*
* @param imageView xml中ImageView實(shí)例
* @param imgUrl 網(wǎng)絡(luò)圖片地址
*/
@BindingAdapter({"android:imageUrl"})
public static void setImageViewResource(ImageView imageView, String imgUrl) {
Context context = imageView.getContext();
//此處通過(guò)imgUrl字符串獲取資源ID,大家可根據(jù)業(yè)務(wù)使用第三方庫(kù)加載網(wǎng)絡(luò)圖片
int resID = context.getResources().getIdentifier(imgUrl, "drawable", context.getPackageName());
imageView.setImageResource(resID);
}
這樣我們就可以通過(guò)android:imageUrl
在xml
布局中直接為ImageView
設(shè)置url
地址了:
<ImageView
...
android:imageUrl="@{itemData.imgUrl}"
/>
DataBinding優(yōu)勢(shì)
Databinding
是MVVM
模式的基礎(chǔ),之前也寫了文章我們?yōu)槭裁匆褂肈ataBinding焕阿,里面通過(guò)代碼的對(duì)比咪啡,總結(jié)說(shuō)明為什么要使用DataBinding的技術(shù),有興趣的同學(xué)可以閱讀一下暮屡,在這里我把文章里的一小段總結(jié)貼出來(lái):
DataBinding為數(shù)據(jù)驅(qū)動(dòng):數(shù)據(jù)變化后自動(dòng)更新UI撤摸;事件處理:直接找到目標(biāo)實(shí)例處理用戶操作的事件。這樣我們就不需要和UI或者控件打交道褒纲,只需要在java代碼中處理業(yè)務(wù)邏輯就好了愁溜,非常清晰,其余的統(tǒng)一交給binding庫(kù)去完成外厂。降低了代碼耦合度冕象,使得數(shù)據(jù)獨(dú)立于UI,對(duì)以后程序的變化和維護(hù)都有積極的影響汁蝶。
總結(jié)
把Databinding
拿出來(lái)單獨(dú)寫了這篇文章渐扮,是希望大家對(duì)Databinding
重視起來(lái),隨著在開發(fā)中越來(lái)越多的使用掖棉,你就更能體會(huì)到它所帶來(lái)的好處墓律,本文主要寫了MultiItem
和DataBinding
的結(jié)合,僅涉及了一些Databinding
基礎(chǔ)用法幔亥,但是也足以對(duì)我們的代碼結(jié)構(gòu)有了很大的提升耻讽,如果大家對(duì)DataBinding
感興趣,歡迎大家多多交流