Android MVVM小结

亦余心之所善兮,虽九死其犹未悔。这篇文章主要讲述Android MVVM小结相关的知识,希望能为你提供帮助。
一、概念关于MVC、MVP与MVVM的概念就不介绍了,总之一句话,MVVM概念出现比MVP早,MVP比MVC早,作为程序员就应该去学习最新的技术不是?详细的概念介绍移步这里吧,https://www.jianshu.com/p/4830912f5162
二、MVVM的使用办法第一步:在工程的build.gradle中配置

1dataBinding{ 2enabled = true 3}

第二步:修改布局文件,记得布局文件一定要用layout标签给括起来,下面先把布局文件都贴出来
1 < ?xml version="1.0" encoding="utf-8"?> 2 < layout xmlns:android="http://schemas.android.com/apk/res/android" 3xmlns:app="http://schemas.android.com/apk/res-auto" 4xmlns:bind="http://schemas.android.com/apk/res-auto" 5xmlns:tools="http://schemas.android.com/tools"> 6 7< data> 8< variable 9name="user" 10type="com.plbear.doncal.rxjavademo.User"> < /variable> 11 12< variable 13name="clickHandler" 14type="com.plbear.doncal.rxjavademo.MainActivity.ClickHandler"> < /variable> 15< /data> 16 17< android.support.constraint.ConstraintLayout 18android:layout_width="match_parent" 19android:layout_height="match_parent"> 20 21< TextView 22android:id="@+id/lab_name" 23android:layout_width="wrap_content" 24android:layout_height="wrap_content" 25android:layout_marginLeft="63dp" 26android:layout_marginStart="63dp" 27android:layout_marginTop="46dp" 28android:text="@{user.name}" 29app:layout_constraintStart_toStartOf="parent" 30app:layout_constraintTop_toBottomOf="@+id/button" /> 31 32< Button 33android:id="@+id/button" 34android:layout_width="wrap_content" 35android:layout_height="wrap_content" 36android:layout_marginLeft="63dp" 37android:layout_marginStart="63dp" 38android:layout_marginTop="26dp" 39android:onClick="@{clickHandler.btnClickHandler}" 40android:text="Button" 41app:layout_constraintStart_toStartOf="parent" 42app:layout_constraintTop_toTopOf="parent" /> 43 44< TextView 45android:id="@+id/lab_passwd" 46android:layout_width="wrap_content" 47android:layout_height="wrap_content" 48android:layout_marginTop="28dp" 49android:text="@{user.passwd}" 50app:layout_constraintStart_toStartOf="@+id/lab_name" 51app:layout_constraintTop_toBottomOf="@+id/lab_name" /> 52 53< /android.support.constraint.ConstraintLayout> 54 < /layout>

从这个布局文件中,我们看到定义了两个变量,分别是user和clickHandler,其中,在两个TextView文件中,分别用以下的办法来来使用:
1 android:text="@{user.name}"

1 android:onClick="@{clickHandler.btnClickHandler}"

第二步:Java文件的修改
新增一个User数据类
1 public class User { 2public ObservableField< String> name = new ObservableField< > (); 3public ObservableField< String> passwd = new ObservableField< > (); 4 }

【Android MVVM小结】MainActivity的代码及解释如下:
1 package com.plbear.doncal.rxjavademo; 2 3 import android.databinding.DataBindingUtil; 4 import android.support.v7.app.AppCompatActivity; 5 import android.os.Bundle; 6 import android.view.View; 7 8 import com.plbear.doncal.rxjavademo.databinding.ActivityMainBinding; 9 10 public class MainActivity extends AppCompatActivity { 11ActivityMainBinding binding; //自动生成ActivityMainBinding类,命名规则是布局文件使用驼峰规则来命名 12final User mUser = new User(); 13 14@Override 15protected void onCreate(Bundle savedInstanceState) { 16super.onCreate(savedInstanceState); 17binding = DataBindingUtil.setContentView(this,R.layout.activity_main); 18mUser.name.set("plbear"); //修改变量 19mUser.passwd.set("123456"); 20binding.setUser(mUser); //设置layout文件中的user值 21 //binding.setClickHandler(new ClickHandler()); //2.设置layout文件中的clickHandler值 22binding.button.setOnClickListener(v -> { 23mUser.passwd.set("change name too"); //1.可以用这种方式设置点击事件,点击后password被设置为change name too 24}); 25} 26 27//2.也可以用这种方式设置点击事件,点击之后,name控件中的值变为 change name 28//设置前需要在前面设置binding.setClickHandler 29 //public class ClickHandler{ 30 //public View.OnClickListener btnClickHandler = v -> { 31 //mUser.name.set("change name"); 32 //}; 33 //} 34 }

  三、换一种实现前面利用ObservableFiled来实现,这种实现方式比较适合于细粒度的实现,但是一旦大量的数据都是通过MVVM的方式来做,这种实现显然是不合时宜的。那就再找一种数据类的实现方式:
1 package com.plbear.doncal.rxjavademo; 2 3 import android.databinding.BaseObservable; 4 import android.databinding.Bindable; 5 import android.databinding.ObservableField; 6 7 public class User extends BaseObservable{ 8@Bindable 9private String name; 10 11@Bindable 12private String passwd; 13 14public void setPasswd(String passwd){ 15this.passwd = passwd; 16notifyPropertyChanged(BR.passwd); 17} 18 19public void setName(String name){ 20this.name = name; 21notifyPropertyChanged(BR.name); 22} 23 24public String getName(){ 25return this.name; 26} 27 28public String getPasswd(){ 29return this.passwd; 30} 31 }

这里有两个坑需要注意下:
  • Bindable标签,这个标签可以用在变量上面,也可以用在getName和getPasswd上面
  • notifyPropertyChanged的时候,一定要通知到Br.passwd,而不是BR.user

    推荐阅读