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??梢韵胂蟮絙inding内部使用这个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。说明绑定成功了。