Подтвердить что ты не робот

Адаптер привязки Android, передающий несколько аргументов, вызывает ошибку

Я совершенно новый в Android Data Binding. Я следую этому руководству: Библиотека привязки данных. Я пытаюсь сделать адаптер, который получает несколько параметров. Это мой код:

XML

   <ImageView
            android:layout_width="@dimen/place_holder_size"
            android:layout_height="@dimen/place_holder_size"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_centerVertical="true"
            app:url="@{image.imageUrl}"
            app:size="@{@dimen/place_holder_size}"
            />

КНОПКИ ADAPTER BINDING

public class ViewBindingAdapters extends BaseObservable {

@BindingAdapter({"bind:url", "bind:size"})
public static void loadImage(ImageView imageView, String url, int size) {
    if (!Strings.isNullOrEmpty(url)) {
        Picasso.with(imageView.getContext()).load(url).resize(size, size).centerCrop().into(imageView);
    }
}
....


}

Но я получаю эту ошибку:

java.lang.RuntimeException: обнаружены ошибки привязки данных. ****/ошибка привязки данных **** msg: Не удается найти установщик для атрибута 'app: url' с параметром type java.lang.String на android.widget.ImageView. file:... li_image_item.xml loc: 30: 27 - 30:40 ****\ошибка передачи данных ****

Кто-нибудь знает, почему?

Спасибо заранее!

4b9b3361

Ответ 1

Задача @dimen/place_holder_size, она возвращает float, пока вы ее ловите как int

измените метод BindingAdapter на

@BindingAdapter({"bind:url", "bind:size"})
public static void loadImage(ImageView imageView, String url, float size) {

}

вы можете ссылаться на

Ответ 2

попробуйте это

 @BindingAdapter(value={"url", "size"}, requireAll=false)
 public static void loadImage(ImageView imageView, String url, int size) {
        if (!Strings.isNullOrEmpty(url)) {
            Picasso.with(imageView.getContext()).load(url).resize(size, size).centerCrop().into(imageView);
        }
    }

Ответ 3

Я ошибался, это порядок аргументов в функции. Вы можете добавить несколько атрибутов в Binding Adapter, но они должны соответствовать аргументам с той же последовательностью, определенной в методе.

Вот мой фрагмент кода для Kotlin

@BindingAdapter(value = ["bind:brand", "bind:model", "bind:age"], requireAll = false)
@JvmStatic
fun bindProductDetails(linearLayout: LinearLayout, brand: String?, model: String?, age: String?) {
    if (brand != null && !brand.isEmpty()) {
        //code
        //code

    }
}

Ответ 4

Обновить

Вам не нужно создавать префикс bind: просто используйте это.

@BindingAdapter({"url", "size"})
public static void loadImage(ImageView imageView, String url, float size) {

}

В XML используйте любой префикс, как app:

app:url="@{image.imageUrl}"