Je suis assez nouveau dans Android Data Binding
. Je suis ce tutoriel: Data Binding Library . J'essaie de faire un adaptateur qui reçoit plusieurs paramètres. Voici mon code:
[~ # ~] 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}"
/>
CLASSE ADAPTATEUR DE LIAISON
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);
}
}
....
}
Mais je reçois cette erreur:
Java.lang.RuntimeException: erreurs de liaison de données trouvées. ****/erreur de liaison de données **** msg: impossible de trouver le setter pour l'attribut 'app: url' avec le type de paramètre Java.lang.String sur Android.widget.ImageView. fichier: ... li_image_item.xml loc: 30: 27 - 30:40 ****\erreur de liaison de données ****
Est-ce que quelqu'un sait pourquoi?
Merci d'avance!
Le problème est @dimen/place_holder_size
, il renvoie float
pendant que vous l'attrapez en tant que int
changez votre méthode BindingAdapter
en ceci
@BindingAdapter({"bind:url", "bind:size"})
public static void loadImage(ImageView imageView, String url, float size) {
}
vous pouvez vous référer ceci
Ce que j'ai mal fait, c'est l'ordre des arguments dans la fonction. Vous pouvez ajouter plusieurs attributs dans l'adaptateur de liaison, mais ils doivent correspondre aux arguments avec la même séquence définie dans la méthode.
Voici mon extrait de code pour 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
}
}
essaye ça
@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);
}
}
Vous n'avez pas besoin de créer de préfixe bind:
, utilisez-le.
@BindingAdapter({"url", "size"})
public static void loadImage(ImageView imageView, String url, float size) {
}
En XML, utilisez n'importe quel préfixe comme app:
app:url="@{image.imageUrl}"