5 votes

Erreur de liaison de données dans le Spinner Android

Je suis en train d'essayer de configurer une liaison bidirectionnelle avec Android Spinner mais je reçois l'erreur suivante.

Caused by: android.databinding.tool.util.LoggedErrorException: Found data binding errors. ****/ data binding error ****msg:Cannot find the getter for attribute 'bind:selectedValue' with value type java.lang.String on android.widget.Spinner****\ data binding error ****

Voici mon SpinnerBindingUtils

public class SpinnerBindingUtils {

    @BindingAdapter(value = {"bind:selectedValue", "bind:selectedValueAttrChanged"},
        requireAll = false)
    public static void bindSpinnerData(AppCompatSpinner pAppCompatSpinner, String newSelectedValue,
        final InverseBindingListener newTextAttrChanged) {
        pAppCompatSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView parent, View view, int position, long id) {
                newTextAttrChanged.onChange();
            }

            @Override
            public void onNothingSelected(AdapterView parent) {
            }
        });
        if (newSelectedValue != null) {
            int pos = ((ArrayAdapter) pAppCompatSpinner.getAdapter()).getPosition(newSelectedValue);
            pAppCompatSpinner.setSelection(pos, true);
        }
    }

    @InverseBindingAdapter(attribute = "bind:selectedValue",
        event = "bind:selectedValueAttrChanged")
    public static String captureSelectedValue(AppCompatSpinner pAppCompatSpinner) {
        return (String) pAppCompatSpinner.getSelectedItem();
    }
}

et c'est mon ViewModel (c'est en Kotlin)

class AddressDetailsViewModel : ViewModel() {
   val states: ObservableArrayList = ObservableArrayList()
   val selectedState: ObservableField = ObservableField("State")
}

layout XML:

1voto

sanoop sandy Points 376

Convertir votre adapteur de liaison de:

@BindingAdapter(value = {"bind:selectedValue", "bind:selectedValueAttrChanged"},
    requireAll = false)

À ceci:

@BindingAdapter(value = {"selectedValue", "selectedValueAttrChanged"},
    requireAll = false)

Et adapteur de liaison inverse de:

    @InverseBindingAdapter(attribute = "bind:selectedValue",
    event = "bind:selectedValueAttrChanged")

À ceci:

@InverseBindingAdapter(attribute = "selectedValue",
    event = "selectedValueAttrChanged")

Et dans votre fichier xml vous pouvez faire ceci:

N'oubliez pas de mettre à jour la balise de votre layout principal comme ceci:

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X