fursa08
@fursa08
Junior Android developer

Почему возникает ClassCastException в onBindViewHolder?

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        when (holder) {
            is FirstLetterViewHolder -> {
                val firstLetter = dataSource[position] as FirstLetter
                holder.bind(firstLetter.letter.toString())
            }
            is AcronymViewHolder -> {
                val acronym = dataSource[position] as Acronym
                holder.bind(acronym)
            }
        }
    }
  • Вопрос задан
  • 59 просмотров
Решения вопроса 1
@YuryBorodkin
Android dev
Очевидно, в классе-адаптере неверно описана логику работа с данным.
Должна быть синхронность модели (того что у вас поле `dataSource`) и ViewHolder-а.
Практически, это значит, что в методе (исходя из того, что используется RecyclerView)

`getItemViewType` должен возвращаться уникальный идентификатор-int для каждого класса-модели. Например
override fun getItemViewType(position: Int): Int {
        return when (val item = dataSource[position]) {
            is FirstLetter -> 1
            is Acronym ->2
            else -> throw IllegalArgumentException("unknown item type $item")
        }
    }

а в `onCreateViewHolder` должен возвращаться такой ViewHolder, который соответсвует уникальному идентификатору для позиции (например для `viewType == 1` должен создаваться `FirstLetterViewHolder`)
Таким образом будет организованность синхронность ViewHolder'ов и модели.
Т.е, если в метод onBindViewHolder передался `AcronymViewHolder` то в dataSource[position] всегдя будет лежать `Acronym`
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@AndroidDev2015
Начал изучать Android/Java
Перед привидением типа нужно проверить что это возможно.
Попробуйте оператор "instanceof" в java "if(x instanceof Integer)" или "is" в kotlin "if(x is Integer)"
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы