前言
本文是MultiItem
系列的進階文章,講解如何利用 DataBinding
改善對MultiItem
的開發,其中RecyclerView
的Adapter
和ViewHolderManager
都不需要編寫,使用庫中封裝的基礎類就可以完成業務程式碼的開發,使你的RecyclerView
程式碼更加乾淨清爽。MutliItem
主要解決多型別RecyclerView Adapter問題,在正常使用中做到了Adapter
零編碼,解放了複雜的Adapter
類,提高擴充套件性。
原始碼地址
Github地址:github.com/free46000/M…,請大家多多關注,更多更新會首先在GitHub上體現,也會在第一時間在本平臺釋出。
系列文章
- MultiItem用法與詳解-優雅的實現多型別
- MultiItem進階 實現Head Foot和載入更多
- MultiItem擴充套件 仿任務皮膚 跨多個RecyclerView的Item拖動 支援縮小後拖動
效果截圖
用法
開啟資料繫結
在build.gradle
開啟DataBinding
:
dataBinding {
enabled = true
}複製程式碼
使用方法
為資料來源註冊ViewHolderManager
管理類:
//初始化adapter
BaseItemAdapter adapter = new BaseItemAdapter();
//繫結寫法一(簡單):直接傳入BR.itemData(VariableId)
adapter.register(TextBean.class, new DataBindViewHolderManager<>(R.layout.item_text_data_bind, BR.itemData));
//繫結寫法二(自由):傳入ItemBindView介面例項,可以定製繫結業務邏輯
adapter.register(ImageTextBean.class, new DataBindViewHolderManager<>(
R.layout.item_image_text_data_bind, this::onBindViewHolder));複製程式碼
上面程式碼中寫法二的實現我們看到了this::onBindViewHolder
這一行程式碼,這是使用表示式後的簡寫方式,就是實現了一個ItemBindView
介面的例項,onBindViewHolder
方法為介面中具體執行的方法:
//將資料繫結的檢視中,具體程式碼由DataBinding庫自動生成
private void onBindViewHolder(ViewDataBinding dataBinding, Object data) {
//還可以寫一些其他的繫結業務邏輯......
dataBinding.setVariable(BR.itemData, data);
}複製程式碼
通過以上簡單幾行程式碼我們就完成了多型別的RecyclerView
列表的程式碼,是不是非常乾淨清爽,其中BaseItemAdapter
和DataBindViewHolderManager
都是MultiItem
庫中封裝好的基礎類,可以在業務程式碼中直接使用。
DataBinding:ImageView載入網路URL
這裡使用了DataBinding
的BindingAdapter
註解,可以為xml
定製一些設值方法,具體使用方式大家可以參考BindingAdapter的官方文件Demo
中BindingAdapter
的定製程式碼:
/**
* 通過android:imageUrl可以在xml佈局中直接為ImageView設定url地址
*
* @param imageView xml中ImageView例項
* @param imgUrl 網路圖片地址
*/
@BindingAdapter({"android:imageUrl"})
public static void setImageViewResource(ImageView imageView, String imgUrl) {
Context context = imageView.getContext();
//此處通過imgUrl字串獲取資源ID,大家可根據業務使用第三方庫載入網路圖片
int resID = context.getResources().getIdentifier(imgUrl, "drawable", context.getPackageName());
imageView.setImageResource(resID);
}複製程式碼
這樣我們就可以通過android:imageUrl
在xml
佈局中直接為ImageView
設定url
地址了:
<ImageView
...
android:imageUrl="@{itemData.imgUrl}"
/>複製程式碼
DataBinding優勢
Databinding
是MVVM
模式的基礎,之前也寫了文章我們為什麼要使用DataBinding,裡面通過程式碼的對比,總結說明為什麼要使用DataBinding的技術,有興趣的同學可以閱讀一下,在這裡我把文章裡的一小段總結貼出來:
DataBinding為資料驅動:資料變化後自動更新UI;事件處理:直接找到目標例項處理使用者操作的事件。這樣我們就不需要和UI或者控制元件打交道,只需要在java程式碼中處理業務邏輯就好了,非常清晰,其餘的統一交給binding庫去完成。降低了程式碼耦合度,使得資料獨立於UI,對以後程式的變化和維護都有積極的影響。
總結
把Databinding
拿出來單獨寫了這篇文章,是希望大家對Databinding
重視起來,隨著在開發中越來越多的使用,你就更能體會到它所帶來的好處,本文主要寫了MultiItem
和DataBinding
的結合,僅涉及了一些Databinding
基礎用法,但是也足以對我們的程式碼結構有了很大的提升,如果大家對DataBinding
感興趣,歡迎大家多多交流