MultiItem進階 使用DataBinding技術讓多類型 RecyclerView更清爽

前言

本文是MultiItem系列的進階文章,講解如何利用 DataBinding改善對MultiItem的開發(fā),其中RecyclerViewAdapterViewHolderManager都不需要編寫,使用庫中封裝的基礎類就可以完成業(yè)務代碼的開發(fā),使你的RecyclerView代碼更加干凈清爽。
MutliItem主要解決多類型RecyclerView Adapter問題,在正常使用中做到了Adapter零編碼,解放了復雜的Adapter類,提高擴展性。

源碼地址

Github地址:https://github.com/free46000/MultiItem,請大家多多關注,更多更新會首先在GitHub上體現(xiàn),也會在第一時間在本平臺發(fā)布。

系列文章

效果截圖

數(shù)據(jù)綁定效果
數(shù)據(jù)綁定效果

用法

開啟數(shù)據(jù)綁定

build.gradle開啟DataBinding

dataBinding {
    enabled = true
}

使用方法

為數(shù)據(jù)源注冊ViewHolderManager管理類:

//初始化adapter
BaseItemAdapter adapter = new BaseItemAdapter();
//綁定寫法一(簡單):直接傳入BR.itemData(VariableId)
adapter.register(TextBean.class, new DataBindViewHolderManager<>(R.layout.item_text_data_bind, BR.itemData));
//綁定寫法二(自由):傳入ItemBindView接口實例,可以定制綁定業(yè)務邏輯
adapter.register(ImageTextBean.class, new DataBindViewHolderManager<>(
        R.layout.item_image_text_data_bind, this::onBindViewHolder));

上面代碼中寫法二的實現(xiàn)我們看到了this::onBindViewHolder這一行代碼,這是使用表達式后的簡寫方式,就是實現(xiàn)了一個ItemBindView接口的實例,onBindViewHolder方法為接口中具體執(zhí)行的方法:

//將數(shù)據(jù)綁定的視圖中,具體代碼由DataBinding庫自動生成
private void onBindViewHolder(ViewDataBinding dataBinding, Object data) {
    //還可以寫一些其他的綁定業(yè)務邏輯......
    dataBinding.setVariable(BR.itemData, data);
}

通過以上簡單幾行代碼我們就完成了多類型的RecyclerView列表的代碼,是不是非常干凈清爽,其中BaseItemAdapterDataBindViewHolderManager都是MultiItem庫中封裝好的基礎類,可以在業(yè)務代碼中直接使用。

DataBinding:ImageView加載網(wǎng)絡URL

這里使用了DataBindingBindingAdapter注解,可以為xml定制一些設值方法,具體使用方式大家可以參考BindingAdapter的官方文檔
DemoBindingAdapter的定制代碼:

/**
 * 通過android:imageUrl可以在xml布局中直接為ImageView設置url地址
 *
 * @param imageView xml中ImageView實例
 * @param imgUrl    網(wǎng)絡圖片地址
 */
@BindingAdapter({"android:imageUrl"})
public static void setImageViewResource(ImageView imageView, String imgUrl) {
    Context context = imageView.getContext();
    //此處通過imgUrl字符串獲取資源ID,大家可根據(jù)業(yè)務使用第三方庫加載網(wǎng)絡圖片
    int resID = context.getResources().getIdentifier(imgUrl, "drawable", context.getPackageName());
    imageView.setImageResource(resID);
}

這樣我們就可以通過android:imageUrlxml布局中直接為ImageView設置url地址了:

<ImageView
    ...
    android:imageUrl="@{itemData.imgUrl}"
    />

DataBinding優(yōu)勢

DatabindingMVVM模式的基礎,之前也寫了文章我們?yōu)槭裁匆褂肈ataBinding,里面通過代碼的對比,總結說明為什么要使用DataBinding的技術,有興趣的同學可以閱讀一下,在這里我把文章里的一小段總結貼出來:

DataBinding為數(shù)據(jù)驅(qū)動:數(shù)據(jù)變化后自動更新UI;事件處理:直接找到目標實例處理用戶操作的事件。這樣我們就不需要和UI或者控件打交道,只需要在java代碼中處理業(yè)務邏輯就好了,非常清晰,其余的統(tǒng)一交給binding庫去完成。降低了代碼耦合度,使得數(shù)據(jù)獨立于UI,對以后程序的變化和維護都有積極的影響。

總結

Databinding拿出來單獨寫了這篇文章,是希望大家對Databinding重視起來,隨著在開發(fā)中越來越多的使用,你就更能體會到它所帶來的好處,本文主要寫了MultiItemDataBinding的結合,僅涉及了一些Databinding基礎用法,但是也足以對我們的代碼結構有了很大的提升,如果大家對DataBinding感興趣,歡迎大家多多交流

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容