安卓 Kotlin - 如何设置 Spinner 选中项

3

我有一个由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列表中的位置。

如果我只是使用 spinner.Units.adapter 来获取适配器,如何安全地将 SpinnerAdapter!强制转换为 ArrayAdapter?或者这种方法是错误的?


你能不能不保存位置呢? - Melquiades
那我就有麻烦了,因为我需要在几个地方显示这个值......我想我可以使用资源数组,嗯......但我还是想知道如何正确地做到这一点。 - Destabilizator
2个回答

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中分配以便设置回值。

啊哈,我之前错误地尝试从 Spinner 中获取适配器,但正确的方式是从资源中获取... 这很有道理! - Destabilizator

0

虽然有点晚了,但对于所有可能正在寻找更紧凑和/或更漂亮的解决方案的人,请尝试查询您放入适配器中的数组。

假设您已将值数组分别保存在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参数,则会抛出NoSuchElement异常,但它将被忽略并将位置默认为0。

如果在将其插入旋转器之前对数组进行了某些魔法操作,最常见的是插入空选择器,则仍然有一种方法可以使用上述技术获取正确的位置。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接