Адаптер привязки 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 ****\ошибка передачи данных ****
Кто-нибудь знает, почему?
Спасибо заранее!
Ответы
Ответ 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}"