Search code examples
androidkotlinspinneronitemselectedlistener

How to retrieve the String of a selected item in spinner outside of onItemSelected method?


I need to retrieve the selected string in a spinner outside of the .onItemSelectedListener. The dropdown menu contains "Each week, each month, each year" strings and I need to retrieve that selected item String in order use them in if conditionals outside of the function.

I've only seen people making Toasts in the onItemSelected function but this doesn't solve my problem.

This is my code:

val spinner = binding.tvAutoComplete
val powtarzanie = resources.getStringArray(R.array.powtarzanie)
val arrayAdapter = ArrayAdapter(requireContext(),
                   R.layout.dropdown_powtarzaj_item,
                   powtarzanie)
spinner.setAdapter(arrayAdapter)
spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
    override fun onItemSelected(
        parent: AdapterView<*>?,
        view: View?,
        position: Int,
        id: Long
    ) {
       val itemText: String = parent?.getItemAtPosition(position).toString()

    }

    override fun onNothingSelected(parent: AdapterView<*>?) {
        TODO("Not yet implemented")
    }
}

Solution

  • One way and probably the most simple way to go about this is to define a global variable:

    private var spinnerSelection: String? = null
    

    and just change it in your onItemSelected implementation:

    spinnerSelection = parent?.getItemAtPosition(pos).toString()
    

    Example code showing the whole flow:

    class MainActivity : AppCompatActivity(), AdapterView.OnItemSelectedListener {
    
        private var spinnerSelection: String? = null
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            val spinner: Spinner = findViewById(R.id.spinner)
            spinner.onItemSelectedListener = this
            ArrayAdapter.createFromResource(
                this,
                R.array.numbers_array,
                android.R.layout.simple_spinner_item
            ).also { adapter ->
                adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
                spinner.adapter = adapter
            }
    
            val button: Button = findViewById(R.id.button)
    
            button.setOnClickListener {
                Log.d("MainActivity", "Currently selected item: $spinnerSelection")
            }
        }
    
        override fun onItemSelected(parent: AdapterView<*>?, view: View?, pos: Int, id: Long) {
            spinnerSelection = parent?.getItemAtPosition(pos).toString()
        }
    
        override fun onNothingSelected(parent: AdapterView<*>?) {
            //TODO("Not yet implemented")
        }
    }