LiveData对象的特定属性的双向数据绑定

时间:2019-05-04 21:17:12

标签: android android-databinding android-livedata

使用LiveData进行双向数据绑定时出现问题。我有一个带有MutableLiveData<Ingredient> ingredient的ViewModel。在XML布局中,我想使用EditText属性初始化ingredient.title视图。我尝试过:

<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="viewModel"
            type="UpdateIngredientViewModel" />
    </data>

    <RelativeLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <EditText
            android:id="@+id/updateIngredient_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:paddingStart="15dp"
            android:paddingEnd="15dp"
            android:text="@={viewModel.ingredient.getValue().title}"
            android:layout_centerHorizontal="true"
            android:layout_below="@+id/updateIngredient_label"
            android:textAlignment="center"
            android:hint="@string/Title"
            android:inputType="text"/>
    </RelativeLayout>
</layout>

因此,使用此行android:text="@={viewModel.ingredient.getValue().title}"初始化Ingredient的标题值,但是例如,如果我更改EditText中的文本并旋转显示,则不会得到更改后的值,但是会初始化一个代替。有人可以帮我吗? 这是我的ViewModel:

public class UpdateIngredientViewModel extends AndroidViewModel {

    private MutableLiveData<Ingredient> ingredient;

    public UpdateIngredientViewModel(@NonNull Application application) {
        super(application);
    }

    public LiveData<Ingredient> getIngredient() {
        if (ingredient == null) {
            ingredient = new MutableLiveData<>();
        }
        return ingredient;
    }

    public void setIngredient(Ingredient ingredient) {
            this.ingredient.setValue(ingredient);
    }
}

编辑

这是成分类:

public class Ingredient {
    @SerializedName("ingredient_ID")
    private int ingredient_ID;
    @SerializedName("title")
    private String title;

    public Ingredient(int ingredient_ID, String title) {
        this.ingredient_ID = ingredient_ID;
        this.title = title;
    }

    public int getIngredient_ID() {
        return ingredient_ID;
    }

    public void setIngredient_ID(int ingredient_ID) {
        this.ingredient_ID = ingredient_ID;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

我还尝试过更改EditText这样的android:text="@={viewModel.ingredient.title}"属性,但似乎它的作用方式与原始帖子相同。

1 个答案:

答案 0 :(得分:0)

双向数据绑定可以更新您的模型。但是,您的方法存在两个问题。

您遇到的一个问题是MutableLiveData不是魔术,如果替换该值,它将很乐意遵循命令。根据{{​​3}},您是在更改配置后替换MutableLiveData中的值,而这与用户输入的内容无关。

另一个问题是,尽管MutableLiveData将保留您的修订后的Ingredient,但该MutableLiveData的其他任何观察者都不知道更改。您正在原位修改模型 ,而MutableLiveData对此一无所知,也无法让其他观察者知道。这就是为什么我更喜欢使用尽可能不变的MutableLiveData对象(例如Kotlin val),结果我跳过了双向数据绑定。