美文网首页
DataBinding与LiveData双向绑定

DataBinding与LiveData双向绑定

作者: 麻油里 | 来源:发表于2019-03-28 10:22 被阅读0次

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

相关文章

网友评论

      本文标题:DataBinding与LiveData双向绑定

      本文链接:https://www.haomeiwen.com/subject/qjifbqtx.html