4

在过去的几周里,我一直在使用数据绑定,现在正在尝试对具有“值”属性的自定义视图使用双向数据绑定。

我的问题是在构建时出现以下错误。

找不到接受参数类型“long”的 <com.twisthenry8gmail.dragline.DraglineView app:value> 的吸气剂

现在我的理解是绑定库将自动使用我的公共设置器和获取器,但是最令人困惑的部分是添加冗余的反向绑定适配器似乎可以解决问题?所以我得到的印象是它使用我的 setter 而不需要适配器,但 getter 不是这种情况?

我的自定义视图

class DraglineView(context: Context, attrs: AttributeSet) : View(context, attrs) {
    ...

    var value = 0L
        set(value) {

            draggedValue = value
            field = value
            invalidate()
        }

    ...
}

我在布局文件中的视图

<com.twisthenry8gmail.dragline.DraglineView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:increment="@{viewmodel.type.minIncrement}"
    app:minValue="@{viewmodel.type.minIncrement}"
    app:value="@={viewmodel.target}" />

我看似多余的适配器

@InverseBindingAdapter(attribute = "value")
@JvmStatic
fun getValueTest(draglineView: DraglineView): Long {

    return draglineView.value
}

我的属性改变了适配器

@BindingAdapter("valueAttrChanged")
@JvmStatic
fun setDraglineListener(draglineView: DraglineView, listener: InverseBindingListener) {

    draglineView.valueChangedListener = {

        listener.onChange()
    }
}
4

2 回答 2

2

在我的数据对象和自定义 NumberPicker 之间使用双向数据绑定时,我遇到了类似的问题(编译时的错误消息:找不到接受参数类型“int”的 <com.shawnlin.numberpicker.NumberPicker app:np_value > 的 getter ')。

我用于 NumberPicker 的库是https://github.com/ShawnLin013/NumberPicker,根据其文档,当前值应使用np_value设置。它可以正常工作(值根据需要进行初始化),除了双向数据绑定给我上面的错误。

但是,将app:np_value更改为android:value(在注释和布局中)解决了这个问题。

在您的情况下,您可以尝试更换

@InverseBindingAdapter(attribute = "value")
@BindingAdapter("valueAttrChanged")
app:value="@={viewmodel.target}

@InverseBindingAdapter(attribute = "android:value")
@BindingAdapter("android:valueAttrChanged")
android:value="@={viewmodel.target}"
于 2021-09-22T09:57:18.367 回答
2

问题是数据绑定系统不知道视图何时更改

InverseBindingAdapter不仅描述了如何从视图中检索,还定义了一个可选的事件属性,该属性将接收一个InverseBindingListener实例。默认事件名称是带有“AttrChanged”后缀的属性名称。

现在让我们看看你的setDraglineListener()适配器。它处理添加和接收valueAttrChanged的属性。剩下的就是当改变时通过调用通知监听器;InverseBindingAdapterInverseBindingListenerlistener.onChange()

于 2020-06-01T11:04:29.573 回答