美文网首页
《安卓-深入浅出MVVM教程》应用篇-07 DataBindin

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

作者: IT天宇 | 来源:发表于2017-10-24 00:04 被阅读338次

    简介

    背景

    这几年 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,还能双向绑定,不知道为什么很少人用)。
    如果你没有兴趣,完全可以跳过本节,不影响后面学习。

    先修要求

    • 会使用 DataBinding

    环境配置

    需要在 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

    相关文章

      网友评论

          本文标题:《安卓-深入浅出MVVM教程》应用篇-07 DataBindin

          本文链接:https://www.haomeiwen.com/subject/uqwzuxtx.html