【问题标题】:Kotlin get ids of selected optionsKotlin 获取所选选项的 ID
【发布时间】:2021-04-20 06:43:26
【问题描述】:

我有多个选项选择,我需要获取选定选项的数组,但我得到的只是选择了最新的选项。

Code

class PublishActivity : AppCompatActivity() {
    
    var selectedTags: List<String>? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_publish)

        pTags.setOnClickListener {
            var tagIds = ArrayList<String>()
            val tagOptions = ArrayList<String>()
            for (i in tags) {
                tagOptions.add(i.title)
                tagIds.add(i.id)
            }
            var checkedItems = ArrayList<Int>()
            checkedItems.forEach{ index -> tagIds[index + 1] }

            MaterialAlertDialogBuilder(this)
                .setTitle(resources.getString(R.string.project_tags))
                .setMultiChoiceItems(tagOptions.toTypedArray(), null) { dialog, which, checked ->
                    if (checked) {
                        checkedItems.add(which)
                    } else if (checkedItems.contains(which)) {
                        checkedItems.remove(Integer.valueOf(which))
                    }
                    // Respond to item chosen
                    pTags.setText("${checkedItems.size} tags selected")
                }
                .setPositiveButton(resources.getString(R.string.ok)) { dialog, which ->
                    for (i in checkedItems) {
                        Log.d("eeee1", tagOptions[i])
                        selectedTags = listOf(tagOptions[i])
                    }
                }
                .setNeutralButton(resources.getString(R.string.clear)) { dialog, which ->
                    pTags.text = null
                    pTags.hint = "0 tag selected"
                    if (checkedItems.size > 0) {
                        checkedItems.clear()
                    }
                }
                .show()
        }
    }
}

Log.d("eeee1", tagOptions[i])在logcat中返回这样的数据

D/eeee1: 3D Printing
D/eeee1: 3D Architecture
D/eeee1: .NET/Mono
D/eeee1: ActionScript

但在我的selectedTags 中,我只得到D/eeer1: [ActionScript]

它应该给我这样的东西D/eeer1: ["3D Printing", "3D Architecture", ".NET/Mono", "ActionScript"]

PS:我实际上希望在这里实现的是获得id 中的selected items 而不是他们的名字,这就是我拥有var tagIds = ArrayList&lt;String&gt;() 的原因,但如果这无法实现只要它只返回所有名称的数组(如上面的示例),我也可以。

有什么想法吗?

【问题讨论】:

  • 使用类似:val checkedItems = booleanArrayOf(false, false, false, false) 并在刚刚设置的.setMultiChoiceItems 中:checkedItems[which] = checked}

标签: android kotlin


【解决方案1】:

以下代码将您的变量设置为包含单个项目的列表。所以你只是一遍又一遍地覆盖你的变量

selectedTags = listOf(tagOptions[i])

你需要:

//Declaration
var selectedTags: MutableList<String> = mutableListOf()

...
// In loop
selectedTags.add(tagOptions[i])

您也可以使用更实用的方法:

//Declaration
var selectedTags: List<String>? = listOf()

...
// Skip the loop and use the map function
.setPositiveButton(resources.getString(R.string.ok)) { dialog, which ->
    selectedTags = checkedItems.map{ tagOptions[it] }
}

要获取 Id 而不是标题,您应该能够使用 tagIds 而不是 tagOptions。只要确保你的打字正确。 selectedTags 列表需要与 tag.id 的类型相同。

【讨论】:

  • 我收到Function invocation 'listOf(...)' expected
  • 啊抱歉,修好了,应该已经选择了那里的标签
  • 现在add 是红色的,上面写着Unresolved reference: add
  • add 是正确的,它是mutableList 上的一个方法,你把selectedTags 改成可变列表了吗? (你不能在 kotlin 的列表中添加东西,因为它是不可变的)
  • 是的,我使用了你的代码 var selectedTags: List&lt;String&gt; = mutableListOf(),但 add 仍然是红色的
【解决方案2】:

您只获得最后插入的值,因为您在单击ok 按钮并将其分配给selectedTags 时创建新列表。 selectedTags = listOf(tagOptions[i]) 代码行的问题。

解决方案:

声明一个列表并将选定的值放入其中。喜欢:

val selectedTags = arrayListOf<String>()

然后在ok按钮内使用下面的代码点击:

              .setPositiveButton("Ok") { dialog, which ->
              for (i in checkedItems) {
                //selectedTags = listOf(tagOptions[i])
                selectedTags.add(tagOptions[i])
              }
            }

【讨论】:

  • 谢谢这部分已经在Adam 的帮助下解决了我现在想要实现的是我的PS: 我的问题的一部分。有什么想法吗?
猜你喜欢
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多