Kotlin Ошибка с условными утверждениями при выборе изображений - PullRequest
0 голосов
/ 04 февраля 2020

Обзор

Я пытаюсь добавить пользовательский макет к элементу управления Android Spinner, чтобы за ним было изображение, за которым сразу следовал какой-то текст. Однако к спиннеру будет добавлено более двухсот строк, поэтому я использую функцию для получения подходящего изображения ресурса (mipmap или drawable). У меня есть специальный адаптер для Spinner, который отлично работает.

Проблема

Проект не будет создан и всегда будет зависать внутри функции, которая выбирает соответствующее изображение (хотя каждый раз на одной строке). Базовая c настройка функции / условия включена ниже.

Сообщение об ошибке не очень ясно:

e: org.jetbrains.kotlin.util.KotlinFrontEndException: Exception while analyzing expression at (821,13) in...

Решение

Если бы я сделал предположение, это потому, что внутри условного оператора слишком много ресурсов и слишком много памяти израсходовано.

Вопрос

Существует ли более эффективный способ обработки добавления этих ресурсов / изображений в счетчик (т. Е. Оператор switch, отображение и т. Д. c.)?

    val every_team_arr = arrayOf<String>("Team 1", "Team 2", "Team 3", ...) // Over 200 teams in total

В функции onCreate () override fun:

    var team_list = ArrayList<Team>()
    for (team in every_team_arr)
    {
        team_list.add(Team(team, getEveryTeamImage(team)))
    }

Вот функция и условие, которое выбирает соответствующее изображение. Это где ошибка происходит, каждый раз в другом месте.

fun getEveryTeamImage(team: String): Int {
    if (team == "Team 1") {
        return R.drawable.team_1
    }
    else if (team == "Team 2") {
        return R.drawable.team_2
    }
    else if (team == "Team 3") {
        return R.drawable.team_3
    }
    else if (team == "Team 4") {
        return R.drawable.team_4
    }

1 Ответ

1 голос
/ 04 февраля 2020

Вместо массива String вы должны определить перечисление. На примере я ожидаю, что для каждой команды название соответствует одному рисуемому ресурсу. Затем вы можете сделать:

enum class Team(val name: String, @DrawableRes val image: Int) {
    TEAM_1("Team 1", R.drawable.team_1),
    TEAM_2("Team 2", R.drawable.team_2),
    TEAM_3("Team 3", R.drawable.team_3)
    // ...
}

Затем вы можете получить доступ к списку команд следующим образом:

val teams = enumValues<Team>()

Таким образом, вы вообще пропустите оператор if.

Позже, предполагая что вам нужен массив String для вашего адаптера, вы можете сделать это:

val teamTitles = teams.map { it.name }.toTypedArray()

И затем, скажем, вы выбрали название, таким образом, у вас есть одно значение String, вы можете найти соответствующую команду таким образом :

val selectedTeam = teams.find { it.name == selectedName }
val image = selectedTeam.image
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...