【Android】快速開(kāi)發(fā)偷懶必備(二) 支持DataBinding啦~爽炸涧至,一行實(shí)現(xiàn)花式列表

本篇文章已授權(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封裝的一些增刪功能雪隧。

單Item
單Item

用法:

和其他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è)。用法阁谆,一句話~

效果如圖:

多Item同數(shù)據(jù)結(jié)構(gòu)
多Item同數(shù)據(jù)結(jié)構(gòu)

用法:

  • 數(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捌议!

效果如圖:

多Item哼拔、多數(shù)據(jù)結(jié)構(gòu)
多Item、多數(shù)據(jù)結(jié)構(gòu)

用法:

  • 數(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)單健民。

注意類BaseBindingAdapterBaseMulTypeBindingAdapter都不是abstract的抒巢,這說(shuō)明我們不需要重寫(xiě)任何方法

利用DataBinding秉犹,我們?cè)贐asexxxAdapter內(nèi)部和xml分別做View的創(chuàng)建和數(shù)據(jù)綁定的工作蛉谜。

UML類圖

UML類圖
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;

mLayoutIdmDatas都由構(gòu)造函數(shù)傳入柜某,沒(méi)啥好說(shuō)的嗽元。

對(duì)外暴漏setItemPresenter(Object itemPresenter)供設(shè)置點(diǎn)擊事件處理類ItemPresenter
ItemPresenterObject類型喂击,這樣才不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)建ViewDataBindingItemView)惭蟋。不再依賴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

本文利用DataBindingViewDataBinding直接略去寫(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市匕垫,隨后出現(xiàn)的幾起案子僧鲁,更是在濱河造成了極大的恐慌,老刑警劉巖象泵,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寞秃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡偶惠,警方通過(guò)查閱死者的電腦和手機(jī)春寿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)忽孽,“玉大人绑改,你說(shuō)我怎么就攤上這事⌒忠唬” “怎么了厘线?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)出革。 經(jīng)常有香客問(wèn)我造壮,道長(zhǎng),這世上最難降的妖魔是什么骂束? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任耳璧,我火速辦了婚禮,結(jié)果婚禮上展箱,老公的妹妹穿的比我還像新娘旨枯。我一直安慰自己,他們只是感情好析藕,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布召廷。 她就那樣靜靜地躺著凳厢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪竞慢。 梳的紋絲不亂的頭發(fā)上先紫,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音筹煮,去河邊找鬼遮精。 笑死,一個(gè)胖子當(dāng)著我的面吹牛败潦,可吹牛的內(nèi)容都是我干的本冲。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼劫扒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼檬洞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起沟饥,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤添怔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后贤旷,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體广料,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年幼驶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了艾杏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盅藻,死狀恐怖购桑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情氏淑,我是刑警寧澤其兴,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站夸政,受9級(jí)特大地震影響元旬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜守问,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一匀归、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧耗帕,春花似錦穆端、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)攒巍。三九已至,卻和暖如春荒勇,著一層夾襖步出監(jiān)牢的瞬間柒莉,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工沽翔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兢孝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓仅偎,卻偏偏與公主長(zhǎng)得像跨蟹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子橘沥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容