DataBindingAdapter在項目中實戰(zhàn)

對于DataBinding不熟悉的小伙伴可以去官網(wǎng)了解下使用教程:https://developer.android.google.cn/topic/libraries/data-binding

這里就不詳細介紹DataBinding了佃蚜,接下來我列舉下在項目中常用的結合不同控件的使用情況湖饱,當然還有很多控件沒有使用到闰蛔,在這里就不一一列舉了唁情,后期會持續(xù)更新上來渺杉。

1. ImageView

圖片加載

@BindingAdapter(value = {"url"})
public static void url(ImageView imageView,String url) {
    //此處可以使用圖片請求框架, 例如
    Picasso.get().load(url).error(R.drawable.ic_empty).into(imageView);
}

ImageView中使用BindingAdapter中的value值\color{#0000FF}{url},如何使用悼泌,代碼如下:

app:url ="@{網(wǎng)絡圖片地址}"

圖片層級設置

@BindingAdapter(value = {"levels"})
public static void setLevel(ImageView imageView,int levels) {
    imageView.setImageLevel(levels);
}

矢量圖顏色修改

@BindingAdapter(value = {"tints"})
public static void setTints(ImageView imageView, @ColorInt int color) {
    imageView.getDrawable().setTint(color);
}

GIF圖片加載

@BindingAdapter({"asset"})
public static void setImageAssent(GifImageView view, String assent) {
    try {
        GifDrawable gifFromAssets = new GifDrawable(view.getContext().getAssets(), assent);
        view.setImageDrawable(gifFromAssets);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

2. RadioGroup

單選

    <RadioGroup
        ...
        android:orientation="horizontal"
        android:onCheckedChanged="@{(group, buttonId) -> vm.setGroupSpeedIndex(group.indexOfChild(group.findViewById(buttonId)))}"
        >
        <androidx.appcompat.widget.AppCompatRadioButton
           ...
            android:checked="@{vm.parameterBean.speedValue==1}"
            android:text="低"/>
        <androidx.appcompat.widget.AppCompatRadioButton
           ...
            android:checked="@{vm.parameterBean.speedValue==2}"
            android:text="中"/>
        <androidx.appcompat.widget.AppCompatRadioButton
            ...
            android:checked="@{vm.parameterBean.speedValue==3}"
            android:text="高"/>
    </RadioGroup>

viewModel中的方法

    public void setGroupSpeedIndex(int index) {
          parameterBean.getSpeedValue().set(index+1);
    }

獲取的值使用雙向綁定BaseObservable

public class ConfigParameterBean extends BaseObservable {

private ObservableField<Integer>  speedValue;  

public ConfigParameterBean(){
    speedValue  = new ObservableField<>(2);
}

public ObservableField<Integer> getSpeedValue() {
    return speedValue;
}
}

3. SeekBar 同上RadioGroup的用法

    <androidx.appcompat.widget.AppCompatSeekBar
        ...
        android:progress="@={vm.parameterBean.downUpValue}"
        />

4. RecycleView

\color{#0000FF}{app:decoration}屬性是獲取分割線垛耳,recycleView中使用如下:

    <androidx.recyclerview.widget.RecyclerView
            ...
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
            app:decoration="@{vm.getItemDecoration()}"
            app:adapter="@{vm.adapter}"
            />

bindingAdapter中的使用:

@BindingAdapter(value = {"decoration"})
public static void setDecoration(RecyclerView recyclerView, RecyclerView.ItemDecoration itemDecoration) {
    recyclerView.addItemDecoration(itemDecoration);
}

ViewModel中的使用:

public RecyclerView.ItemDecoration getItemDecoration(){
    DividerItemDecoration itemDecoration = new DividerItemDecoration(getApplication(), DividerItemDecoration.VERTICAL);
    itemDecoration.setDrawable(Objects.requireNonNull(ContextCompat.getDrawable(getApplication(), R.drawable.bg_trans_item_height_10)));
    return itemDecoration;
}
//適配器
public MapAdapter getAdapter(){
    return adapter;
}

5. SwipeRefreshLayout

SwipeRefreshLayoutd控件的使用,\color{#0000FF}{app:colorResIds}加載顏色的設置啸箫,如下:

    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
         ...
        app:colorResIds="@{vm.getColorResId()}"
        app:refreshing="@{vm.isRefreshing}"
        app:onRefreshListener="@{vm::onRefresh}"
        >
       ...
    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

bindingAdapter中的使用:

@BindingAdapter(value = {"colorResIds"})
public static void setColorResIds(SwipeRefreshLayout refreshLayout,@ColorRes int... colorInt) {
    refreshLayout.setColorSchemeResources(colorInt);
}

ViewModel中的使用:
\color{#FF0000}{(注意:數(shù)據(jù)加載完成耸彪,isRefreshing的值要設置為false)}

public @ColorRes int[] getColorResId(){
    return new int[]{R.color.purple_200,R.color.purple_500,R.color.purple_700,R.color.teal_200,R.color.teal_700};
}

public MutableLiveData<Boolean> getIsRefreshing() {
    return isRefreshing;
}

6. SmartRefreshLayout

SmartRefreshLayout的使用(目前使用2.0.3版本)

    <com.scwang.smart.refresh.layout.SmartRefreshLayout
        ...
        app:hasMore="@{vm.hasMore}"
        app:refreshing="@{vm.refreshing}"
        app:moreLoading="@{vm.moreLoading}"
        app:onRefreshListener="@{()->vm.onRefresh()}"
        app:onLoadMoreListener="@{()->vm.onLoadMore()}"
        >
        <androidx.recyclerview.widget.RecyclerView
            ...
            />
    </com.scwang.smart.refresh.layout.SmartRefreshLayout>

bindingAdapter中的使用:

@BindingAdapter(value = {"refreshing","moreLoading","hasMore"},requireAll = false)
public static void bindSmartRefreshLayout(SmartRefreshLayout smartLayout, Boolean refreshing, Boolean moreLoading, Boolean hasMore) {
    if (!refreshing) smartLayout.finishRefresh();
    if (!hasMore) smartLayout.finishLoadMoreWithNoMoreData();
    if (!moreLoading) smartLayout.finishLoadMore();
}

@BindingAdapter(value = {"autoRefresh"})
public static void bindSmartRefreshLayout(SmartRefreshLayout smartLayout,boolean autoRefresh) {
    if (autoRefresh) smartLayout.autoRefresh();
}

@BindingAdapter(value = {"onRefreshListener","onLoadMoreListener"},requireAll = false)
public static void bindSmartRefreshLayout(SmartRefreshLayout smartLayout, OnRefreshListener onRefreshListener, OnLoadMoreListener onLoadMoreListener) {
    smartLayout.setOnRefreshListener(onRefreshListener);
    smartLayout.setOnLoadMoreListener(onLoadMoreListener);
}

@BindingAdapter(value = {"refreshing"})
public static void bindSmartRefreshLayout(SwipeRefreshLayout swipeRefreshLayout, Boolean refreshing) {
    swipeRefreshLayout.setRefreshing(refreshing);
}

veiwModel中的使用:

  1. 繼承于BaseViewModelPage,實現(xiàn)\color{#FF0000}{onRefresh()忘苛、onLoadMore()} 方法;
  2. 數(shù)據(jù)加載完成要記得調(diào)用\color{#FF0000}{onRefreshSuccess()蝉娜、onRefreshError()}方法
  3. autoRefresh()方法未使用唱较,待驗證,如果有問題可以告訴我召川。
@Override
public void onRefresh() {
    super.onRefresh();
    requestData();//數(shù)據(jù)請求
}

@Override
public void onLoadMore() {
    super.onLoadMore();
    requestData();
}

//大家可以根據(jù)自己的需求去處理數(shù)據(jù)加載邏輯
private void requestData() {
    if (null != iViewListener) iViewListener.startLoading();
    //noinspection ConstantConditions
    requestManager.getMessages(getPage().getValue(), 20)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<MessagesBean>() {
                @Override
                public void onSubscribe(@NonNull Disposable d) {
                    
                }

                @Override
                public void onNext(@NonNull MessagesBean success) {
                    if (null != iViewListener)iViewListener.stopLoading();
                    if (null != success.getData() && success.getData().size() > 0) {
                        total = success.getTotalCount();
                        data.addAll(success.getData());
                    }
                    adapter.notifyDataSetChanged();
                    onRefreshSuccess();
                }

                @Override
                public void onError(@NonNull Throwable e) {
                    if (null != iViewListener) iViewListener.stopLoading();
                    adapter.notifyDataSetChanged();
                    onRefreshError();
                }

                @Override
                public void onComplete() {

                }
            });
}

viewModel的基類代碼較多南缓,這里將源碼貼出來

public abstract class BaseViewModelPage<D> extends BaseModel {
private final MutableLiveData<Integer> page = new MutableLiveData<>();       //頁碼
private final MutableLiveData<Boolean> refreshing = new MutableLiveData<>(); //刷新
private final MutableLiveData<Boolean> moreLoading = new MutableLiveData<>();//加載更多
private final MutableLiveData<Boolean> hasMore = new MutableLiveData<>();    //是否全部加載
private final MutableLiveData<Boolean> autoRefresh = new MutableLiveData<>();//自動刷新
protected final List<D> data = new ArrayList<>();  //數(shù)據(jù)集合
protected int total = 0;                           //數(shù)據(jù)總數(shù)

public BaseViewModelPage(@NonNull Application application) {
    super(application);
    page.setValue(0);
    refreshing.setValue(true);
    moreLoading.setValue(true);
    hasMore.setValue(true);
    autoRefresh.setValue(false);
}

@CallSuper
public void onLoadMore() {
    page.setValue(page.getValue()==null?0: page.getValue()+1);
    if (refreshing.getValue())refreshing.setValue(false);
    if (!moreLoading.getValue())moreLoading.setValue(true);
}

@CallSuper
public void onRefresh() {
    page.setValue(0);
    refreshing.setValue(true);
    if (data.size()>0) data.clear();
    if (moreLoading.getValue()) moreLoading.setValue(false);
    if (!hasMore.getValue()) hasMore.setValue(true);
}

@CallSuper
public void autoRefresh() {
    autoRefresh.setValue(true);
}

public MutableLiveData<Integer> getPage() {
    return page;
}

public MutableLiveData<Boolean> getHasMore() {
    return hasMore;
}

public MutableLiveData<Boolean> getRefreshing() {
    return refreshing;
}

public MutableLiveData<Boolean> getMoreLoading() {
    return moreLoading;
}

public MutableLiveData<Boolean> getAutoRefresh() {
    return autoRefresh;
}

protected void onRefreshSuccess(){
    if (page.getValue() == 0) {
        if (refreshing.getValue()) refreshing.setValue(false);
    } else {
        if (data.size()>= total) {
            if (hasMore.getValue()) hasMore.setValue(false);
        } else {
            if (!hasMore.getValue()) hasMore.setValue(true);
        }
        if (moreLoading.getValue())moreLoading.setValue(false);
    }
}

protected void onRefreshError() {
    if (page.getValue() == 0) {
        if (!refreshing.getValue()) refreshing.setValue(true);
    } else {
        if (data.size()>= total) {
            if (hasMore.getValue()) hasMore.setValue(false);
        } else {
            if (!hasMore.getValue()) hasMore.setValue(true);
        }
        if (moreLoading.getValue())moreLoading.setValue(false);
    }
}

//重寫父類的方法子類也需要調(diào)用時使用
@CallSuper
@Override
public void onCleared() {
    super.onCleared();
}
}

最后,希望對大家有所幫助荧呐,如果有不足的地方歡迎大家指正汉形,謝謝。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坛增,一起剝皮案震驚了整個濱河市获雕,隨后出現(xiàn)的幾起案子薄腻,更是在濱河造成了極大的恐慌收捣,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庵楷,死亡現(xiàn)場離奇詭異罢艾,居然都是意外死亡,警方通過查閱死者的電腦和手機尽纽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門咐蚯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人弄贿,你說我怎么就攤上這事春锋。” “怎么了差凹?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵期奔,是天一觀的道長。 經(jīng)常有香客問我危尿,道長呐萌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任谊娇,我火速辦了婚禮肺孤,結果婚禮上,老公的妹妹穿的比我還像新娘济欢。我一直安慰自己赠堵,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布法褥。 她就那樣靜靜地躺著茫叭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挖胃。 梳的紋絲不亂的頭發(fā)上杂靶,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天梆惯,我揣著相機與錄音,去河邊找鬼吗垮。 笑死垛吗,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的烁登。 我是一名探鬼主播怯屉,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼饵沧!你這毒婦竟也來了锨络?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤狼牺,失蹤者是張志新(化名)和其女友劉穎羡儿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體是钥,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡掠归,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了悄泥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虏冻。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖弹囚,靈堂內(nèi)的尸體忽然破棺而出厨相,到底是詐尸還是另有隱情,我是刑警寧澤鸥鹉,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布蛮穿,位于F島的核電站,受9級特大地震影響宋舷,放射性物質(zhì)發(fā)生泄漏绪撵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一祝蝠、第九天 我趴在偏房一處隱蔽的房頂上張望音诈。 院中可真熱鬧,春花似錦绎狭、人聲如沸细溅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喇聊。三九已至,卻和暖如春蹦狂,著一層夾襖步出監(jiān)牢的瞬間誓篱,已是汗流浹背朋贬。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留窜骄,地道東北人锦募。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓庆捺,卻偏偏與公主長得像呆贿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鲁驶,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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