《安卓-深入淺出MVVM教程》應(yīng)用篇-07 DataBinding (數(shù)據(jù)與視圖綁定)

簡(jiǎn)介

背景

這幾年 MVP 架構(gòu)在安卓界非常流行,幾乎已經(jīng)成為主流框架勉躺,它讓業(yè)務(wù)邏輯 和 UI操作相對(duì)獨(dú)立玖雁,使得代碼結(jié)構(gòu)更清晰缀旁。


MVVM 在前端火得一塌糊涂阻星,而在安卓這邊卻基本沒見到幾個(gè)人在用挪蹭,看到介紹 MVVM 也最多是講 DataBinding 或 介紹思想的讽坏。偶爾看到幾篇提到應(yīng)用的溃列,還是對(duì)谷歌官網(wǎng)的Architecture Components 文章的翻譯。

相信大家看別人博客或官方文檔的時(shí)候懊渡,總會(huì)碰到一些坑刽射。要么入門教程寫得太復(fù)雜(無(wú)力吐槽,前面寫一堆原理距贷,各種高大上的圖柄冲,然并卵吻谋,到實(shí)踐部分一筆帶過(guò)忠蝗,你確定真的是入門教程嗎)。要么就是簡(jiǎn)單得就是一個(gè) hello world漓拾,然后就沒有下文了(看了想罵人)阁最。


實(shí)在看不下去的我,決定插手你的人生骇两。

目錄

《安卓-深入淺出MVVM教程》大致分兩部分:應(yīng)用篇速种、原理篇。
采用循序漸進(jìn)方式低千,內(nèi)容深入淺出配阵,符合人類學(xué)習(xí)規(guī)律,希望大家用最少時(shí)間掌握 MVVM示血。

應(yīng)用篇:

01 Hello MVVM (快速入門)
02 Repository (數(shù)據(jù)倉(cāng)庫(kù))
03 Cache (本地緩存)
04 State Lcee (加載/空/錯(cuò)誤/內(nèi)容視圖)
05 Simple Data Source (簡(jiǎn)單的數(shù)據(jù)源)
06 Load More (加載更多)
07 DataBinding (數(shù)據(jù)與視圖綁定)
08 RxJava2
09 Dragger2
10 Abstract (抽象)
11 Demo (例子)
12-n 待定(歡迎 github 提建議)

原理篇

01 MyLiveData(最簡(jiǎn)單的LiveData)
02-n 待定(并不是解讀源碼棋傍,那樣太無(wú)聊了,打算帶你從0擼一個(gè) Architecture)

關(guān)于提問(wèn)

本人水平和精力有限难审,如果有大佬發(fā)現(xiàn)哪里寫錯(cuò)了或有好的建議瘫拣,歡迎在本教程附帶的 github倉(cāng)庫(kù) 提issue。
What告喊?為什么不在博客留言麸拄?考慮到國(guó)內(nèi)轉(zhuǎn)載基本無(wú)視版權(quán)的情況,一般來(lái)說(shuō)你都不是在源出處看到這篇文章黔姜,所以留言我也一般是看不到的拢切。

教程附帶代碼

https://github.com/ittianyu/MVVM

應(yīng)用篇放在 app 模塊下,原理篇放在 implementation 模塊下秆吵。
每一節(jié)代碼采用不同包名失球,相互獨(dú)立。

前言

上一節(jié)是介紹了 LoadMore,也就是常見的 List 下拉刷新和加載更多实苞。

這一節(jié)是在 04 節(jié)的基礎(chǔ)上開始的豺撑,請(qǐng)大家拷貝一份之前04的項(xiàng)目。(注意黔牵,后面幾節(jié)也是從 04 的項(xiàng)目開始聪轿,所以建議保留一份不動(dòng))

從這一節(jié)開始,講的多半是和其他一些類庫(kù)的整合猾浦,所以如果之前不了解這些類庫(kù)的陆错,是會(huì)暈車的。

但也不是你非得把所有篇章都學(xué)會(huì)金赦,比如我認(rèn)識(shí)的很多人音瓷,寧愿用 ButterKnife 也不用 DataBinding(講道理,DataBinding 強(qiáng)大得多夹抗,不僅不用 findViewById绳慎,還能雙向綁定,不知道為什么很少人用)漠烧。
如果你沒有興趣杏愤,完全可以跳過(guò)本節(jié),不影響后面學(xué)習(xí)已脓。

先修要求

  • 會(huì)使用 DataBinding

環(huán)境配置

需要在 app build.gradle 中開啟 dataBinding

android {
...
    dataBinding {
        enabled true
    }
...
}

xml

在最外面套一層 layout珊楼,并加上 data
然后讓 tv_id tv_name 和 data 綁定

注意,id 是 int度液, 所以在綁定時(shí)厕宗,需要轉(zhuǎn)換一下
android:text="@{String.valueOf(user.id)}"

<?xml version="1.0" encoding="utf-8"?>
<layout>
    <data>
        <variable
            name="user"
            type="com.ittianyu.mvvm.g_data_binding.common.bean.User"/>

    </data>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:orientation="horizontal">

            <EditText
                android:id="@+id/et_username"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:imeOptions="actionSearch"
                android:singleLine="true"
                android:text="ittianyu" />

            <Button
                android:id="@+id/btn_search"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="search" />

        </LinearLayout>

        <FrameLayout
            android:id="@+id/v_root"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <LinearLayout
                android:id="@+id/v_content"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="center"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tv_id"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@{String.valueOf(user.id)}"
                    android:gravity="center" />

                <TextView
                    android:id="@+id/tv_name"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@={user.name}"
                    android:gravity="center" />

            </LinearLayout>

            <FrameLayout
                android:id="@+id/v_error"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:gravity="center"
                    android:text="Network error, click to reload" />

            </FrameLayout>

            <FrameLayout
                android:id="@+id/v_empty"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:gravity="center"
                    android:text="User not exist" />

            </FrameLayout>

            <FrameLayout
                android:id="@+id/v_loading"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <ProgressBar
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center" />

            </FrameLayout>

        </FrameLayout>
    </LinearLayout>
</layout>

View

initView

得益于 DataBinding,我們已經(jīng)不需要 findViewById堕担,可以通過(guò) bind. 來(lái)訪問(wèn) View已慢。

private GActivityUserBinding bind;

private void initView() {
    bind = DataBindingUtil.setContentView(this, R.layout.g_activity_user);
    bind.setUser(new User());

}

private void showContent() {
    bind.vContent.setVisibility(View.VISIBLE);
    bind.vEmpty.setVisibility(View.GONE);
    bind.vError.setVisibility(View.GONE);
    bind.vLoading.setVisibility(View.GONE);
}

...

updateView

之前更新 View,需要通過(guò)引用手動(dòng)去設(shè)置照宝,但現(xiàn)在只需要給 bind 設(shè)置 data 就行蛇受,自動(dòng)映射到 UI。
谷歌大禮包配合DataBinding 打出成噸輸出厕鹃,美滋滋兢仰。

private void updateView(Lcee<User> lcee) {
    switch (lcee.status) {
        case Content: {
            showContent();
            bind.setUser(lcee.data);
            break;
        }
        case Empty: {
            showEmpty();
            break;
        }
        case Error: {
            showError();
            break;
        }
        case Loading: {
            showLoading();
            break;
        }
    }
}

總結(jié)

這一節(jié)主要是加入 DataBinding。熟悉 DataBinding 肯定是非常輕松就學(xué)會(huì)拉剂碴。

下一節(jié)也是從 04 基礎(chǔ)上開始講整合 RxJava

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末把将,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子忆矛,更是在濱河造成了極大的恐慌察蹲,老刑警劉巖请垛,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異洽议,居然都是意外死亡宗收,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門亚兄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)混稽,“玉大人,你說(shuō)我怎么就攤上這事审胚⌒傺” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵膳叨,是天一觀的道長(zhǎng)洽洁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)菲嘴,這世上最難降的妖魔是什么饿自? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮临谱,結(jié)果婚禮上璃俗,老公的妹妹穿的比我還像新娘奴璃。我一直安慰自己悉默,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布苟穆。 她就那樣靜靜地躺著抄课,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雳旅。 梳的紋絲不亂的頭發(fā)上跟磨,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音攒盈,去河邊找鬼抵拘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛型豁,可吹牛的內(nèi)容都是我干的僵蛛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼迎变,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼充尉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起衣形,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤驼侠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倒源,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡苛预,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笋熬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碟渺。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖突诬,靈堂內(nèi)的尸體忽然破棺而出苫拍,到底是詐尸還是另有隱情,我是刑警寧澤旺隙,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布绒极,位于F島的核電站,受9級(jí)特大地震影響蔬捷,放射性物質(zhì)發(fā)生泄漏垄提。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一周拐、第九天 我趴在偏房一處隱蔽的房頂上張望铡俐。 院中可真熱鬧,春花似錦妥粟、人聲如沸审丘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)滩报。三九已至,卻和暖如春播急,著一層夾襖步出監(jiān)牢的瞬間脓钾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工桩警, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留可训,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓捶枢,卻偏偏與公主長(zhǎng)得像握截,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柱蟀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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