Android中的MVVM架构设计实践和想法

在实际项目中很少用到MVVM,因为如果在一个团队中,本团队又是做一些需要快速成品的项目,那么让你放弃熟悉的MVP而去使用MVVM,这恐怕一般人都不愿意尝试,何况不是每个人都熟悉这框架,而且很有可能无法把控项目周期!但是任何困难都不应该是我们踏步不前的理由,早些时候就已经了解过MVVM,今天得空,做一些记录!

  • 项目中使用mvvm

使用mvvm,必然会用到android为我们提供的dataBinding支持包

我们编写module中的build.gradle,添加这样的脚本就好了,如图:
build.gradle配置.png
到这里,我们已经完成了项目中使用MVVM的初始化配置
  • 项目中XML的布局文件变化

databinding框架有自己的一套布局规则,所以使用mvvm也不例外,下面看看布局如何来写

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="thrid"
            type="com.booktest.mymvvm.ThridObservableItem"/>
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:id="@+id/text1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{thrid.strTextA}"/>
        <TextView
            android:id="@+id/text2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text='@{thrid.boolTextB ==true ? "真的":"假的"}'/>
        <TextView
            android:id="@+id/text3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{thrid.strTextC}"/>
        <Button
            android:id="@+id/bt_change"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=" I want to change"/>
    </LinearLayout>
</layout>

细心的朋友应该都注意到了,布局跟以往的不一样了,这就是差异所在!

最外层用<layout>标签嵌套,
- <data>标签,这个标签其实就是让我们进行数据绑定的一个标签
- <variable>标签里面分别有<type> <name>两个标签,分别来标识变量类型和变量名称
- <type>标签 标识变量类型,比如java.lang.String这就是String类型,com.booktest.mymvvm.ThridObservableItem 这个就是一个我自定义的一个User类型
- <name>标签 表示的就是我们定义的一个变量名称,这个变量名称我们会在下方的布局和对应的java代码中引用到

绑定的最基础的显示:@{name.字段}

ThridObservableItem.java类的两种实现:
  1. Observable 双向绑定支持监听的数据类型 显示更新的内容,无需手动操作更新,只需更新数据源,直接让布局发生变化
public class ThridObservableItem {
    public ObservableField<String> strTextA=new ObservableField<>();
    public ObservableBoolean boolTextB=new ObservableBoolean();
    public ObservableField<String> strTextC=new ObservableField<>();
    //ObservableField 在获取数据的时候需要做一次调用
    //如:String n = name.get()
    //同理设置的时候也需要
    //如:name.set("姓名");
    //除了ObservableField,还有ObservableBoolean、ObservableInt ……
}
  1. 让Model实体继承自BaseObservable,并且对相应的属性的get()方法增加@Bindable注解,在set()方法中增加notifyPropertyChanged(BR.对应的控件id)属性,如果在BR.对应的控件id的时候提示找不到控件id,不要着急,Build一下工程即可!
public class ThridObservableItem2 extends BaseObservable {
    private String strTextA;
    private Boolean strTextB;
    private String strTextC;

    public ThridObservableItem2(String strTextA, Boolean strTextB, String strTextC) {
        this.strTextA = strTextA;
        this.strTextB = strTextB;
        this.strTextC = strTextC;
    }
    @Bindable
    public String getStrTextA() {
        return strTextA;
    }

    public void setStrTextA(String strTextA) {
        this.strTextA = strTextA;
        notifyPropertyChanged(BR.strTextA);
    }
    @Bindable
    public Boolean getStrTextB() {
        return strTextB;
    }

    public void setStrTextB(Boolean strTextB) {
        this.strTextB = strTextB;
        notifyPropertyChanged(BR.strTextB);
    }
    @Bindable
    public String getStrTextC() {
        return strTextC;
    }

    public void setStrTextC(String strTextC) {
        this.strTextC = strTextC;
        notifyPropertyChanged(BR.strTextC);
    }
}

哪个方式方便???自己琢磨!!!

  • Activity文件中的使用

public class Main3Activity extends AppCompatActivity {
    private ActivityThridBinding binding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding= DataBindingUtil.setContentView(this,R.layout.activity_thrid);
        final ThridObservableItem thridObservableItem=new ThridObservableItem();
        thridObservableItem.strTextA.set("这是Observable");
        thridObservableItem.boolTextB.set(true);
        thridObservableItem.strTextC.set("说的没错,确实如此");
        binding.setThrid(thridObservableItem);
        binding.btChange.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                thridObservableItem.strTextA.set("这是Observable");
                thridObservableItem.boolTextB.set(false);
                thridObservableItem.strTextC.set("说的不对");
            }
        });
    }
}

DataBindingUtil.setContentView(this,R.layout.activity_thrid)设置布局内容;
可能大家发现了ActivityThridBinding,这个是类型名称怎么来的呢?不要着急,有规则,首先我们要知道我们使用的布局名称,我这里引用的布局是:R.layout.activity_thrid,然而我的Activity的binding类型名称是ActivityThridBinding,是的,有联系!

activity_thrid.xml布局文件,经过DataBindingUtil生成的类是ActivityThridBinding类
规则:就是按照布局名的顺序依次输出,最后边加上Binding即可

我们还可以查看工程目录下通过DataBindingUtil生成的类:
DataBindingUtil生成的类.png
如果我们的XML布局中没有运用dataBinding的<layout>标签嵌套,是不会生成这些类的,也就无法实例。

最终效果如下:
双向绑定效果.gif

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容