使用ViewModel和Model进行数据绑定

时间:2019-01-06 18:23:19

标签: android data-binding androidx android-jetpack two-way

(法国,抱歉造成误解)

我对Android上的数据绑定是陌生的,并且正在为一个相当简单的问题而苦苦挣扎。

假设我有这个POJO,我们将其作为模型的一部分

public class User
{
    public String name;

    public User(String name)
    {
        this.name = name;
    }
}

现在我有一个包含用户的ViewModel

public class MyViewModel extends ViewModel
{
    private User user = new User("blue");

    public String getName()
    {
        return user.name;
    }

    public void setName(String name)
    {
        user.name = name;
    }
}

我希望视图(活动)能够在此“名称”字段上进行双向数据绑定。我知道如何进行Activity和XML等操作,例如设置Binding类等。我不知道的是,如何使ViewModel对于User类的“ name”字段上的任何更改都是可观察的。请注意,我不想通过执行以下操作使我的User类可观察:

public class User
{
    public MutableLiveData<String> name;

    public User(String name)
    {
        this.name.setValue(name);
    }
}

因为我个人更喜欢将此Android设备远离我的模型。

如何更改ViewModel,以便View可以侦听“名称”的更改?我已经看到了@Bindable批注中的某些内容,但是我不确定如何使用它。

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

You can add Bindable like this in your POJO Class

public class User extends BaseObservable
{
  public String name;
  public User(String name)
  {
    this.name = name;
  }

 @Bindable
 public String getName() 
 {
    return name;
 }

 public void setName(String name)
 {
    this.name = name;
    notifyPropertyChanged(BR.name);
}
}

答案 1 :(得分:0)

在布局文件中,您将得到类似的内容:

<data>
    <variable name="vm" type="<your_package>.MyViewModel" />
</data>

然后,您可能会有类似TextView这样的名称,该名称使用以下方式绑定:

        <TextView
            android:id="@+id/name"
            android:text="@{vm.name}"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

您需要做的另一件事是在活动/片段中调用以下命令:

binding.setLifecycleOwner(this)

(以及binding.vm = yourViewModelInstance