Search code examples
android-fragmentsandroid-arrayadapterandroid-spinner

Spinner keeps last selected item


I have a spinner with an array adapter. The spinner is populated inside a fragment onCreateView().

spinner.setSelection(0)
spinner.onItemSelectedListener =
object : AdapterView.OnItemSelectedListener {
    override fun onItemSelected(parent: AdapterView<*>, view: View?, pos: Int, id: Long) {
    }

    override fun onNothingSelected(var1: AdapterView<*>?) {
    }
}

Whenever I get back to the fragment and the spinner is created, the last selected item is selected when onItemSelected() is called automatically and ignoring the spinner.setSelection(0) call. I have put many logs to see what is going, but I cannot understand why the lately selected item is the one being selected by default and not the one at position 0.


Solution

  • I solved the issue by setting a click listener on the drop down view and basically do the same stuff I was doing with the OnItemSelectedListener.

    override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
        val binding = SpinnerItemChartDropdownBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false
        )
        val item = getItem(position)
        val root = binding.root
        bindDropdown(root, item)
    
        binding.setClickListener {
            listener.onChartRangeSelected(item)
        }
        return root
    }
    

    One important stuff. You need to do something like this, to dismiss the drop down view after an item has been selected:

     fun hideSpinnerDropDown(spinner: Spinner) {
        try {
            val method: Method = Spinner::class.java.getDeclaredMethod("onDetachedFromWindow")
            method.isAccessible = true
            method.invoke(spinner)
        } catch (e: java.lang.Exception) {
            e.printStackTrace()
        }
    }