1

I am trying to get the selected value from the spinner and set this value to my TextView using 2 way data binding and Observable string. I have tried the below code but I am unable to set the value of the selected item within the textview.

<androidx.appcompat.widget.AppCompatSpinner
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:entries="@array/array_name"
            android:id="@+id/spinner"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.0"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            bind:selectedValue="@={viewModel.text.get()}"
            />
       <TextView
            app:layout_constraintTop_toBottomOf="@+id/spinner"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:hint="@string/submit"
            android:text="@={viewModel.text.get()}"/>

Binding Adapter to bind spinner data to text using inverse binding

@BindingAdapter(value = ["selectedValue", "selectedValueAttrChanged"], requireAll = false)
    fun bindSpinnerData(
        pAppCompatSpinner: AppCompatSpinner,
        newSelectedValue: String?,
        newTextAttrChanged: InverseBindingListener
    ) {
        pAppCompatSpinner.onItemSelectedListener = object : OnItemSelectedListener {
            override fun onItemSelected(
                parent: AdapterView<*>?,
                view: View?,
                position: Int,
                id: Long
            ) {
                newTextAttrChanged.onChange()
            }

            override fun onNothingSelected(parent: AdapterView<*>?) {}
        }
        if (newSelectedValue != null) {
            val pos =
                (pAppCompatSpinner.adapter as ArrayAdapter<String?>).getPosition(
                    newSelectedValue
                )
            pAppCompatSpinner.setSelection(pos, true)
        }
    }

    @InverseBindingAdapter(attribute = "selectedValue", event = "selectedValueAttrChanged")
    fun captureSelectedValue(pAppCompatSpinner: AppCompatSpinner): String? {
        return pAppCompatSpinner.selectedItem as String
    }
}

ViewModel

class SelectionViewModel: BaseViewModel<SelectionNavigator>() {
    private var text: ObservableField<String>? = null
    fun SelectionViewModel() {
        text = ObservableField()
    }

    fun getText(): ObservableField<String>? {
        return text
    }

}

0 Answers0