Android привязка данных - не удается найти геттер для <>, который принимает тип параметра 'long' - PullRequest
2 голосов
/ 26 мая 2020

Я использовал привязку данных в течение последних нескольких недель, и теперь я пытаюсь использовать двустороннюю привязку данных для пользовательского представления с атрибутом value.

Моя проблема в том, что я получаю следующее ошибка при сборке.

Не удается найти геттер для который принимает тип параметра 'long'

Теперь я понял, что библиотека привязки будет автоматически использовать мои сеттеры и геттеры publi c, однако самая запутанная часть - добавление избыточного адаптера обратной привязки, похоже, решать проблему? Таким образом, у меня создается впечатление, что он использует мой сеттер без адаптера, но это не относится к геттеру? был бы очень признателен. Вот мой соответствующий код, спрашивайте, если у вас есть вопросы!

Мой пользовательский вид

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()
    }
}

1 Ответ

3 голосов
/ 01 июня 2020

Проблема в том, что система привязки данных не знает, когда представление изменяет значение .

InverseBindingAdapter не только описывает, как получить значение из представления, но также определяет необязательное свойство event , которое получит InverseBindingListener экземпляр. Имя события по умолчанию - это имя атрибута с суффиксом «AttrChanged».

Теперь давайте посмотрим на ваш setDraglineListener() адаптер. Он обрабатывает атрибут valueAttrChanged, добавленный InverseBindingAdapter, и получает InverseBindingListener. Осталось только уведомить слушателя при изменении значения путем вызова listener.onChange();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...