ViewModel和数据绑定

时间:2017-06-08 17:36:05

标签: android

Android最近推出了Architecture Components,特别是ViewModel,这是

  

旨在存储和管理与UI相关的数据,以便数据能够在配置更改(如屏幕旋转)

后继续存在

在Google提供的示例中,ViewModel的使用方式如下:

public class MyActivity extends AppCompatActivity {
    public void onCreate(Bundle savedInstanceState) {
        MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
        model.getUsers().observe(this, users -> {
            // update UI
        });
    }
}

问题:ViewModel如何假设与Data Binding相关联?

我的意思是,在数据绑定的情况下,将会有一个binding为UI提供数据。

它会是这样的:

...
model.getUsers().observe(this, users -> {
  // update binding, that will auto-update the UI?
});
...

2 个答案:

答案 0 :(得分:3)

您可以在布局xml文件中声明viewmodel类型的变量。 在您的viewmodel类中实现公共方法,数据将通过该方法绑定到ui。

然后,您只需要在onCreate中将视图模型设置为绑定。在数据绑定中设置视图模型实例时,已在viewmodel中加载的数据将设置为重新创建的布局。

如果您的布局中有回收器视图,您可以在视图模型类中实现一些公共方法,如initRecyclerView(),并在绑定中设置视图模型后调用onCreate(),或者可以从视图模型设置适配器数据绑定也是如此。

答案 1 :(得分:-1)

您的layout_name.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">

   <data>
       <import type="android.view.View"/>
       <variable
           name="model"
           type="com.yourpackage.ViewModelName"/>
   </data>

   <RelativeLayout
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:background="@color/white"
       android:visibility="@{model.someVariable == true ? View.VISIBLE : View.GONE}">

   </RelativeLayout>
</layout>

您的Activity类看起来像

public class YourActivityName extends BaseActivity
{
    private ViewModelName viewModelVariable;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ViewModelName viewModelVariable = new ViewModelName(); 
        ViewDataBinding viewDataBinding = DataBindingUtil.setContentView(this, R.layout.layout_name);
        viewDataBinding.setVariable(BR.model, viewModelVariable);

    }
}

ViewModel类看起来像

public class ViewModelName extends BaseObservable{
    //Logic and variables for view model
    public boolean someVariable;
}