DataBinding、LiveData、ViewModel的简单使用

1,363 阅读1分钟

一、概述

通过一个简单的例子介绍一下DataBinding、LiveData、ViewModel的简单使用

二、ViewModel介绍

如果需要Activity的上下文,就需要继承AndroidViewModel(用这个在绑定的时候也会有区别,下面讲),在构造方法里会获取到上下文。

MyViewModule.java

public class MyViewModule extends AndroidViewModel {

    //实现双向绑定 liveData + DataBinding
    private MutableLiveData<String> phoneInfo;
    private Context mContext;
    public MyViewModule(@NonNull Application application) {
        super(application);
        mContext = application;
    }

    //初始化LiVeData里的数据
    public MutableLiveData<String> getPhoneInfo() {
        if(phoneInfo == null){
            phoneInfo = new MutableLiveData<>();
            phoneInfo.setValue("1");
        }
        return phoneInfo;
    }
    
    //点击事件,让数据拼接个C
    public void add(){
        phoneInfo.setValue(phoneInfo.getValue()+"c");
    }

}

三、DataBinding布局上的绑定

  1. layout包裹住布局

  2. 添加data标签

  3. varianle标签里的name是type的别名,用于xml里的调用

  4. type是ViewModule的类名

  5. @{mv.ViewModule}这个方式进行数据的绑定

  6. @{()->mv.add()} 进行方法的绑定

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable
            name="mv"
            type="com.lzl.myapplication2.MyViewModule" />
    </data>
<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{mv.phoneInfo}"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />
    <Button
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        android:onClick="@{()->mv.add()}"/>

</androidx.constraintlayout.widget.ConstraintLayout>

</layout>

四、在MainActivity里进行绑定

  1. DataBinging用DataBingUtil进行创建。

  2. ViewModel用ViewModelProvider进行创建。

public class MainActivity extends AppCompatActivity {

    //dataBinging
    private ActivityMainBinding dataBing;
    private MyViewModule mMyViewModule;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
        dataBing = DataBindingUtil.setContentView(this,R.layout.activity_main);
        //viewModel的方式
//        mMyViewModule = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(MyViewModule.class);
        //androidviewModel用的这个。是为了在里面获得到上下文,所以用的这个。
        mMyViewModule = new ViewModelProvider(getViewModelStore(),new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(MyViewModule.class);
        //view上数据修改,更新viewModule的绑定
        dataBing.setMv(mMyViewModule);
        //viewModule的数据修改,更新到view上的绑定。
        dataBing.setLifecycleOwner(this);
    }
}