Skip to main content

Dropdown with Spinner & AutoCompleteTextView

 <com.google.android.material.textfield.TextInputLayout

style="@style/Widget.Material3.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<AutoCompleteTextView
android:id="@+id/autoCompleteTv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none"
/>

object AutoCompleteHelper {

fun <T> initializeAutoCompleteTextView(
context: Context,
autoCompleteTextView: AutoCompleteTextView,
data: List<T>,
displayFunction: (T) -> String,
onItemSelectedListener: (position: Int, selectedItem: T) -> Unit
) {
val adapter = ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, data.map(displayFunction))
autoCompleteTextView.setAdapter(adapter)

autoCompleteTextView.setOnItemClickListener { _, _, position, _ ->
val selectedItem = data[position]
onItemSelectedListener(position, selectedItem)
}
}

fun <T> setAutoCompleteSelectionByValue(
autoCompleteTextView: AutoCompleteTextView,
data: List<T>,
valueToSelect: T,
displayFunction: (T) -> String = { it.toString() }
) {
val position = data.indexOf(valueToSelect)
if (position >= 0) {
autoCompleteTextView.setText(displayFunction(data[position]), false)
}
}



fun setAutoCompleteSelectionByIndex(
autoCompleteTextView: AutoCompleteTextView,
data: List<String>,
index: Int
) {
if (index >= 0 && index < data.size) {
autoCompleteTextView.setText(data[index], false)
}
}
}



object SpinnerHelper {

fun <T> initializeSpinner(
context: Context,
spinner: Spinner,
data: List<T>,
displayFunction: (T) -> String,
onItemSelectedListener: (position: Int, selectedItem: T, view: View?, id: Long) -> Unit
) {
val adapter = ArrayAdapter(context, android.R.layout.simple_spinner_item, data.map(displayFunction))
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
spinner.adapter = adapter

spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
val selectedItem = data[position]
onItemSelectedListener(position, selectedItem, view, id)
}

override fun onNothingSelected(parent: AdapterView<*>?) {
// No action needed here
}
}
}



fun <T> setSpinnerSelectionByValue(
spinner: Spinner,
data: List<T>,
valueToSelect: T
) {
val position = data.indexOf(valueToSelect)
if (position >= 0) {
spinner.setSelection(position)
}
}



fun setSpinnerSelectionByIndex(spinner: Spinner, index: Int) {
if (index >= 0 && index < spinner.adapter.count) {
spinner.setSelection(index)
}
}
}

Comments

Popular posts from this blog

Api Call with Mvvm+JetPackCompose Kotlin

 Add Important Dependency alias( libs . plugins . compose . compiler ) id( "org.jetbrains.kotlin.plugin.serialization" ) version "2.0.0" alias( libs . plugins . compose . compiler ) apply false buildFeatures { dataBinding = true viewBinding = true compose = true } compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose" , version . ref = "kotlin" } //jetpack compose dependency dependencies { val composeBom = platform( "androidx.compose:compose-bom:2024.10.01" ) implementation ( composeBom ) androidTestImplementation ( composeBom ) // Choose one of the following: // Material Design 3 implementation ( "androidx.compose.material3:material3" ) // or Material Design 2 implementation ( "androidx.compose.material:material" ) // or skip Material Design and build directly on top of foundational components implementation ( "androidx.compose.foundation:foundation...