简体   繁体   中英

How to bind to an Android Spinner using a ViewModel

I am trying to find out how to bind both the list items, and the selected value/index of an Android Spinner (I am pretty new to Android / Kotlin)

I have the following....

<Spinner
    android:layout_row="17"
    android:layout_column="2"
    android:id="@+id/spinner1"
    android:layout_width="1200px"
    android:entries="@{viewModel.devicesDescriptions}"
    app:selectedValue="@={viewModel.devicePosition}"
    android:layout_height="wrap_content"
    android:background="@android:drawable/btn_dropdown"
    android:spinnerMode="dropdown"/>

and in the View Model

val devicesDescriptions = ObservableArrayList<String>()
var devices = listOf<MidiDeviceInfo>()
fun setFoundDevices(d: MutableList<MidiDeviceInfo>) {
    devices = d
    for (dev in devices)
        devicesDescriptions.add(dev.toString())
}

By trial and error I could set just strings to the Spinner items (the MidiDeviceInfo would have been better, but string will do)

However, I cannot get a binding to get the selectedItem to work.

I have tried many things, but with the above, I have the error

    Found data binding error(s):
    [databinding] {"msg":"Cannot find a getter for \u003candroid.widget.Spinner app:selectedValue\u003e that accepts parameter type \u0027java.lang.String\u0027\n\nIf a binding adapter provides the getter, check that the adapter is annotated correctly and that the parameter type matches.","file":"app\\src\\main\\res\\layout\\activity_main.xml","pos":[{"line0":334,"col0":4,"line1":343,"col1":39}]}

Anyone know a way to do this?

Try using android:selectedItemPosition="@={viewModel.devicePosition}" instead of app:selectedValue="@={viewModel.devicePosition}" .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM