带有 BindingAdapter 的 MutableLiveData 不更新视图的可见性

nil*_*lsi 6 java data-binding android android-livedata

即使我多次更新 LiveData,我的 BindingAdapter 也只运行一次。

public class ButtonViewBindingAdapter
{
    @BindingAdapter("hideIfZero")
    public static void setHideIfZero(View view, MutableLiveData<Integer> currentPosition)
    {
        view.setVisibility(currentPosition.getValue() == 0 ? View.GONE : View.VISIBLE);
    }
}
Run Code Online (Sandbox Code Playgroud)
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <variable
            name="viewModel"
            type="com.package.PermissionsViewModel"/>

        <variable
            name="clickHandler"
            type="com.package.PermissionsActivity.ClickHandler"/>
    </data>

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

        <Button
            android:id="@+id/buttonNext"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:background="@null"
            android:onClick="@{() -> clickHandler.nextSlide()}"
            android:text="@string/intro_next"
            android:textColor="@android:color/white"
            />

        <Button
            android:id="@+id/buttonBack"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentBottom="true"
            android:background="@null"
            android:onClick="@{() -> clickHandler.previousSlide()}"
            android:text="@string/intro_back"
            android:textColor="@android:color/white"
            app:hideIfZero="@{viewModel.currentSlidePosition}"/>

    </RelativeLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)

public class PermissionsViewModel extends ViewModel
{
    private MutableLiveData<Integer> currentSlidePosition = new MutableLiveData<>();

    public PermissionsViewModel()
    {
        currentSlidePosition.setValue(0);
    }

    public void setCurrentSlidePosition(final int position)
    {
        currentSlidePosition.setValue(position);
    }

    public MutableLiveData<Integer> getCurrentSlidePosition()
    {
        return currentSlidePosition;
    }
}

Run Code Online (Sandbox Code Playgroud)

当我更新视图模型中的值时,可见性仍然没有改变。BindingAdapter 不会多次运行。我在这里缺少什么?我希望它在位置为 0 时隐藏,否则它应该显示。

Com*_*are 19

如果您未能调用setLifecycleOwner()绑定对象,数据绑定仍然有效,但无法获得任何更新。IIRC,您会在LiveData绑定时获得初始值,但之后什么也没有。

我刚刚提交了一个功能请求,以获取数据绑定,以便在您无法调用setLifecycleOwner().

  • 即使在文档中也没有说明这一点(https://developer.android.com/topic/libraries/data-binding/expressions#binding_data) (2认同)

Ish*_*gra 9

例子:

binding.lifecycleOwner = this
Run Code Online (Sandbox Code Playgroud)

这是片段/活动等。