《安卓-深入浅出MVVM教程》应用篇-07 DataBindin

2017-10-24  本文已影响338人  IT天宇

简介

背景

这几年 MVP 架构在安卓界非常流行,几乎已经成为主流框架,它让业务逻辑 和 UI操作相对独立,使得代码结构更清晰。


MVVM 在前端火得一塌糊涂,而在安卓这边却基本没见到几个人在用,看到介绍 MVVM 也最多是讲 DataBinding 或 介绍思想的。偶尔看到几篇提到应用的,还是对谷歌官网的Architecture Components 文章的翻译。

相信大家看别人博客或官方文档的时候,总会碰到一些坑。要么入门教程写得太复杂(无力吐槽,前面写一堆原理,各种高大上的图,然并卵,到实践部分一笔带过,你确定真的是入门教程吗)。要么就是简单得就是一个 hello world,然后就没有下文了(看了想骂人)。


实在看不下去的我,决定插手你的人生。

目录

《安卓-深入浅出MVVM教程》大致分两部分:应用篇、原理篇。
采用循序渐进方式,内容深入浅出,符合人类学习规律,希望大家用最少时间掌握 MVVM。

应用篇:

01 Hello MVVM (快速入门)
02 Repository (数据仓库)
03 Cache (本地缓存)
04 State Lcee (加载/空/错误/内容视图)
05 Simple Data Source (简单的数据源)
06 Load More (加载更多)
07 DataBinding (数据与视图绑定)
08 RxJava2
09 Dragger2
10 Abstract (抽象)
11 Demo (例子)
12-n 待定(欢迎 github 提建议)

原理篇

01 MyLiveData(最简单的LiveData)
02-n 待定(并不是解读源码,那样太无聊了,打算带你从0撸一个 Architecture)

关于提问

本人水平和精力有限,如果有大佬发现哪里写错了或有好的建议,欢迎在本教程附带的 github仓库 提issue。
What?为什么不在博客留言?考虑到国内转载基本无视版权的情况,一般来说你都不是在源出处看到这篇文章,所以留言我也一般是看不到的。

教程附带代码

https://github.com/ittianyu/MVVM

应用篇放在 app 模块下,原理篇放在 implementation 模块下。
每一节代码采用不同包名,相互独立。

前言

上一节是介绍了 LoadMore,也就是常见的 List 下拉刷新和加载更多。

这一节是在 04 节的基础上开始的,请大家拷贝一份之前04的项目。(注意,后面几节也是从 04 的项目开始,所以建议保留一份不动)

从这一节开始,讲的多半是和其他一些类库的整合,所以如果之前不了解这些类库的,是会晕车的。

但也不是你非得把所有篇章都学会,比如我认识的很多人,宁愿用 ButterKnife 也不用 DataBinding(讲道理,DataBinding 强大得多,不仅不用 findViewById,还能双向绑定,不知道为什么很少人用)。
如果你没有兴趣,完全可以跳过本节,不影响后面学习。

先修要求

环境配置

需要在 app build.gradle 中开启 dataBinding

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

xml

在最外面套一层 layout,并加上 data
然后让 tv_id tv_name 和 data 绑定

注意,id 是 int, 所以在绑定时,需要转换一下
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,我们已经不需要 findViewById,可以通过 bind. 来访问 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,需要通过引用手动去设置,但现在只需要给 bind 设置 data 就行,自动映射到 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;
        }
    }
}

总结

这一节主要是加入 DataBinding。熟悉 DataBinding 肯定是非常轻松就学会拉。

下一节也是从 04 基础上开始讲整合 RxJava

上一篇 下一篇

猜你喜欢

热点阅读