DataBinding與LiveData雙向綁定

LiveData在單獨使用時,想要在數據變化時通知View需要設置一個監聽

liveData.observe(this, new Observer<String>() {
    @Override
    public void onChanged(String s) {
        
    }
});

而我們通常是在ViewModel中持有LiveData的引導,而ViewModel中不能持有View的引用,這就很糾結。查閱官方文檔了解到。從Android Studio3.1開始,支持DataBinding自動綁定ViewModel。這樣在數據變化時,就不用手動設置監聽來對View進行相應的變化。

下面講下要怎么做

首先定義一個ViewModel持有LiveData

public class MyViewModel extends ViewModel {
    MutableLiveData<String> liveData;

    public MutableLiveData<String> getName() {
        if (liveData == null) {
            liveData = new MutableLiveData<>();
        }
        return liveData;
    }

    public void setName(String name) {
        if (liveData == null) {
            liveData = new MutableLiveData<>();
        }
        liveData.setValue(name);
    }
}

在Activity的OnCreate中初始化

public class MainActivity extends AppCompatActivity {

    ActivityMainBinding binding;

    MyViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        binding.setLifecycleOwner(this);
        binding.setMainActivity(this);

        viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
        viewModel.setName("aaa");
        binding.setViewModel(viewModel);
    }


    public void onButtonClick() {
        viewModel.setName("bbb");
    }
}

這里給binding設置了一個LifecycleOwner。可以想象到binding內部使用這個LifecycleOwner給liveData設置了監聽。

在xml中

<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"
    tools:context=".MainActivity">

    <data>
        <variable
            name="MainActivity"
            type="com.qianfanyun.databinding.MainActivity" />

        <variable
            name="viewModel"
            type="com.qianfanyun.databinding.MyViewModel"/>
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_horizontal"
        android:orientation="vertical">

        <Button
            android:id="@+id/button"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:text="@={viewModel.name}"
            android:onClick="@{()->MainActivity.onButtonClick()}"
             />

    </LinearLayout>
</layout>

這里給Button設置了一個點擊事件,點擊后會改變liveData的值,然后會發現Button的text變成了bbb。說明綁定成功了。

另外嘗試了View綁定Data,與普通的綁定相同,在@與{之間加個=,也是可以成功的,這里就不多說了。

參考

Bind layout views to Architecture Components

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容