Search code examples
androidkotlinspinnerandroid-spinner

Set array from Kotlin to Android spinner when spinner expects XML string array


I have used Android's spinner for static values by setting string-array in XML resources. This works without issue.

However, for a specific spinner, I need to set data dynamically based on API returns. While I have set the returned values into an array of strings, when I send this to the adapter, it expects type Int (which a returned string-array from XML translates into).

I'm not sure how to make these arrays work within Kotlin to be received by the spinner.

val managerSpinner: Spinner = binding.spinnerManager
        val managerList: MutableList<String> = mutableListOf()
        var managerArr: Array<String>

        viewModel.managers.observe(viewLifecycleOwner, {
            if (null != it) {
                it.items?.forEach { manager ->
                    managerList.add(manager.fullname!!)
                }
                managerArr = managerList.toTypedArray()
                ArrayAdapter.createFromResource(
                        activity?.applicationContext!!,
                        managerArr!!,
                        android.R.layout.simple_spinner_item
                ).also { adapter ->
                    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
                    managerSpinner.adapter = adapter
                }
            }
        })

Solution

  • how about like this:

    1. it use ArrayAdapter constructor rather than using createFromResource function factory
    2. use addAll function to add item
    val managerSpinner: Spinner = binding.spinnerManager
            val managerList: MutableList<String> = mutableListOf()
            var managerArr: Array<String>
    
            viewModel.managers.observe(viewLifecycleOwner, {
                if (null != it) {
                    it.items?.forEach { manager ->
                        managerList.add(manager.fullname!!)
                    }
                    managerArr = managerList.toTypedArray()
                    ArrayAdapter(
                            activity?.applicationContext!!,
                            android.R.layout.simple_spinner_item
                    ).also { adapter ->
                        adapter.addAll(managerArr)
                        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
                        managerSpinner.adapter = adapter
                    }
                }
            })