How to set Spinner default value to null?

后端 未结 10 1646
天命终不由人
天命终不由人 2020-11-29 02:36

I\'m trying to get a Spinner to load up with no selected value. Once the user selects a value it then takes them to another page.

This is proving to be a problem be

10条回答
  •  -上瘾入骨i
    2020-11-29 03:01

    I assume that you want to have a Spinner with first empty invisible item (that is a strange feature of Spinner that cannot show a list without selecting an item). You should add a class that will contain data:

    data class YourData(val id: Int, val name: String?)
    

    This is the adapter.

    class YourAdapter(
        context: Context,
        private val textViewResourceId: Int,
        private var items: ArrayList
    ) : ArrayAdapter(context, textViewResourceId, items) {
    
        private var inflater: LayoutInflater = context.getSystemService(
            Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
    
        override fun getCount(): Int = items.size + 1
    
        override fun getItem(position: Int): YourData? =
            if (position == 0) YourData(0, "") else items[position - 1]
    
        override fun getItemId(position: Int): Long = position.toLong()
    
        override fun getView(position: Int, convertView: View?, parent: ViewGroup): View =
            if (position == 0) {
                getFirstTextView(convertView)
            } else {
                getTextView(convertView, parent, position - 1)
            }
    
        override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View =
            getView(position, convertView, parent)
    
        private fun getFirstTextView(convertView: View?): View {
            // Just simple TextView as initial selection.
            var textView: TextView? = convertView as? TextView
            val holder: FirstViewHolder
            if (textView?.tag !is FirstViewHolder) {
                textView = TextView(context) // inflater.inflate(R.layout.your_text, parent, false) as TextView
                textView.height = 0 // Hide first item.
                holder = FirstViewHolder()
                holder.textView = textView
                textView.tag = holder
            }
            return textView
        }
    
        private fun getTextView(
            convertView: View?,
            parent: ViewGroup,
            position: Int
        ): TextView {
            var textView: TextView? = convertView as? TextView
            val holder: ViewHolder
            if (textView?.tag is ViewHolder) {
                holder = textView.tag as ViewHolder
            } else {
                textView = inflater.inflate(textViewResourceId, parent, false) as TextView
                holder = ViewHolder()
                holder.textView = textView
                textView.tag = holder
            }
            holder.textView.text = items[position].name
    
            return textView
        }
    
        private class FirstViewHolder {
            lateinit var textView: TextView
        }
    
        private class ViewHolder {
            lateinit var textView: TextView
        }
    }
    

    To create:

    YourAdapter(context!!, R.layout.text_item, ArrayList())
    

    To add items:

    private fun fill(items: List, adapter: YourAdapter) {
        adapter.run {
            clear()
            addAll(items)
            notifyDataSetChanged()
        }
    }
    

    When you load items to your Spinner with that fill() command, you should know, that indices are also incremented. So if you wish to select 3rd item, you should now select 4th: spinner?.setSelection(index + 1)

提交回复
热议问题