Skip to content

Instantly share code, notes, and snippets.

@Aidanvii7
Last active March 7, 2020 11:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Aidanvii7/dec94fb96c67b9e4cac0c04dd7edc489 to your computer and use it in GitHub Desktop.
Save Aidanvii7/dec94fb96c67b9e4cac0c04dd7edc489 to your computer and use it in GitHub Desktop.
Binding adapter for Android Spinner view when using https://github.com/Aidanvii7/Toolbox
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:singleLine="true"
android:layout_width="match_parent"
android:paddingStart="20dp"
android:layout_height="40dp"
android:ellipsize="marquee"
android:gravity="center_vertical"
android:textAlignment="inherit"/>
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Spinner
import androidx.databinding.BindingAdapter
import androidx.databinding.InverseBindingAdapter
import androidx.databinding.InverseBindingListener
import com.aidanvii.toolbox.databinding.getTrackedValue
import com.aidanvii.toolbox.databinding.trackValue
@InverseBindingAdapter(attribute = "selectedItem", event = "selectedItemAttrChanged")
internal fun <T : Any> Spinner.getBoundSelectedItem(): T? =
getTrackedValue<List<T>?>(R.id.list_items)?.getOrNull(selectedItemPosition)
@BindingAdapter("selectedItem")
internal fun <T : Any> Spinner.setBoundSelectedItem(selectedItem: T?) {
if (selectedItem != null && selectedItem != getSelectedItem()) {
val items = getTrackedValue<List<T>?>(R.id.list_items)
items?.indexOf(selectedItem)?.let { itemIndex ->
if (itemIndex >= 0) {
setSelection(itemIndex)
}
}
}
}
@BindingAdapter(
"items",
"selectedItemAttrChanged", requireAll = false
)
internal fun <T : Any> Spinner.bind(
items: List<T>?,
selectedItemAttrChanged: InverseBindingListener?
) {
if (items != null) {
trackValue(
newValue = items,
valueResId = R.id.list_items,
onNewValue = {
adapter = ArrayAdapter(
context,
R.layout.spinner_item,
items
).apply {
setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
}
onItemSelectedListener = selectedItemAttrChanged?.run {
object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
onChange()
}
override fun onNothingSelected(parent: AdapterView<*>?) {
onChange()
}
}
}
},
onOldValue = {
adapter = null
onItemSelectedListener = null
}
)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment