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。說明綁定成功了。