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
}
}