Могу ли я использовать ArrayList <String>, map или hashmap в циклах в качестве выражений или операторов, чтобы меньше повторений в моем коде? - PullRequest
1 голос
/ 13 марта 2020

Мои пункты меню будут значительно увеличены, поэтому я хотел бы знать, могу ли я использовать Array, map или hashmap в выражениях, чтобы иметь меньше повторений. Теперь у меня есть

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    // Handle item selection
    var messages: ArrayList<String>
    var timestamps: ArrayList<String>
    var linknames: ArrayList<String>
    var parsedData: ParsedData

    return when (item.itemId) {
        dataIdRead[0] -> {
            Thread(Runnable {
                parsedData = GetMessages(dataCity[0]).getParsedData()
                timestamps = parsedData.timestamps
                messages = parsedData.messages
                linknames = parsedData.linknames
                runOnUiThread {
                    rv_message_list.adapter =
                        MessageAdapter(messages, timestamps, linknames, this)
                    button.visibility = View.VISIBLE
                }
            }).start()
            true
        }

        dataIdRead[1] -> {
            Thread(Runnable {
                parsedData = GetMessages(dataCity[1]).getParsedData()
                timestamps = parsedData.timestamps
                messages = parsedData.messages
                linknames = parsedData.linknames
                runOnUiThread {
                    rv_message_list.adapter =
                        MessageAdapter(messages, timestamps, linknames, this)
                    button.visibility = View.VISIBLE
                }
            }).start()
            true
        }
        dataIdRead[2] -> {
            Thread(Runnable {
                parsedData = GetMessages(dataCity[2]).getParsedData()
                timestamps = parsedData.timestamps
                messages = parsedData.messages
                linknames = parsedData.linknames
                runOnUiThread {
                    rv_message_list.adapter =
                        MessageAdapter(messages, timestamps, linknames, this)
                    button.visibility = View.VISIBLE
                }
            }).start()
            true
        }
        else -> super.onOptionsItemSelected(item)

и

   val dataIdRead = arrayOf(R.id.helsinki, R.id.vantaa, R.id.espoo)
   val dataCity = arrayOf("helsinki", "vantaa", "espoo")

Что-то, что заставило бы его выглядеть примерно так

return when (item.itemId) {
        *some magic* -> {
            Thread(Runnable {
                parsedData = GetMessages(*some magic*).getParsedData()
                timestamps = parsedData.timestamps
                messages = parsedData.messages
                linknames = parsedData.linknames
                runOnUiThread {
                    rv_message_list.adapter =
                        MessageAdapter(messages, timestamps, linknames, this)
                    button.visibility = View.VISIBLE
                }
            }).start()
            true
        }
        else -> super.onOptionsItemSelected(item)

Я пробовал пример для каждого, но в начале Строка return when (item.itemId) { ждет выражения, и я с этим не справился.

1 Ответ

0 голосов
/ 13 марта 2020

вам не нужно все oop для этого. Просто получите индекс dataIdRead. если это не -1, вставьте этот индекс в dataCity.

val index =  dataIdRead.indexOf(item.itemId) 
return if(index == -1) { 
     print("item not found")
     super.onOptionsItemSelected(item) }
else {
      Thread(Runnable {
            parsedData = GetMessages(dataCity[ index ]).getParsedData()
            timestamps = parsedData.timestamps
            messages = parsedData.messages
            linknames = parsedData.linknames
            runOnUiThread {
                rv_message_list.adapter =
                    MessageAdapter(messages, timestamps, linknames, this)
                button.visibility = View.VISIBLE
            }
        }).start()
        true
}
...