【问题标题】:Android Kotlin - How to set Spinner selected itemAndroid Kotlin - 如何设置 Spinner 选定项
【发布时间】:2018-10-23 04:59:51
【问题描述】:

我有一个微调器,其中填充了来自 XML 的字符串数组:

<Spinner
                android:id="@+id/spinnerUnits"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="8dp"
                android:entries="@array/units"
                app:layout_constraintStart_toEndOf="@+id/barrier3"
                app:layout_constraintTop_toBottomOf="@+id/labelGeneric" />

当用户选择某些内容时,我将其保存到 SharedPreferences。 下次打开应用程序时如何设置该值?我只保存了值,而不是它在微调器列表中的位置。'

如果我只是做 spinner.Units.adapter 来获取适配器,那么如何安全地使用 SpinnerAdapter!到 ArrayAdapter?或者这是错误的做法?

【问题讨论】:

  • 可以不保存位置吗?
  • 那么我遇到了相反的麻烦,因为我需要在几个地方显示值......我想我可以使用资源数组,嗯......但我还是想知道如何正确地做到这一点

标签: android kotlin spinner


【解决方案1】:

好吧,您还需要发布适配器代码,但在这里我将给出一个示例,我将如何在适配器中进行操作。

 val adapterGender = ArrayAdapter<String>(context, layoutCode, context.resources.getStringArray(R.array.genderArray))

 override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
        val data = listOfItems[holder!!.adapterPosition]
        holder.etName?.setText(data.name)
        holder.spGender?.adapter = adapterGender
        holder.spGender?.setSelection(adapterGender.getPosition(data.gender))
    }

{
        val etName: AppCompatEditText? = itemView?.findViewById(R.id.etName)
        val spGender: AppCompatSpinner? = itemView?.findViewById(R.id.spGender)

        init {
            //listener for gender selection
            spGender?.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
                override fun onNothingSelected(p0: AdapterView<*>?) {

                }

                override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
                    listOfItems[adapterPosition].gender = p0?.selectedItem.toString()
                    Log.d("TAG", p0?.selectedItem.toString())
                }
            }

        }
    }

所以基本上我在 spinner 上设置了一个onItemSelectedListener 并监听值的变化,然后在模型/pojo 中设置它以保持和分配onBindViewHolder 以设置回值。

【讨论】:

  • 啊哈,我错误地试图从微调器中获取适配器,但正确的方法是从资源中获取它......这很有意义!
【解决方案2】:

参加聚会有点晚了,但对于所有可能寻求更紧凑和/或更漂亮的解决方案的人来说;尝试查询您放入适配器的数组。

假设您已经分别保存了值数组,无论是在 XML 中还是在类字段中,并且您知道选定的值但不知道位置,您可以使用 indexOf 方法和 first {...} 查询来获取位置。

因此,以您为例,可以这样实现:

fun setSpinnerSelectionByValue(value: String) {
    val xmlArray: Array<String> = context.resources.getStringArray(R.array.units) // get array from resources
    val spinner = findViewById<Spinner>(R.id.spinnerUnits) // get the spinner element

    spinner.setSelection(xmlArray.indexOf(
        xmlArray.first { elem -> elem == value } // find first element in array equal to value
    )) // get index of found element and use it as the position to set spinner to.
}

如果数组中没有元素等于value 参数,first 查询将抛出NoSuchElement 异常,但它会被忽略并且位置将默认为 0。

如果在将数组插入微调器之前对数组进行了一些魔法,其中最常见的是插入空选择器,那么很可能仍然有一种方法可以使用上述技术获得正确的位置。

例如,当插入空选择器时,您可以简单地在 indexOf 方法之后添加 + 1,并且仍然可以在微调器中获得正确的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多