169 похожих чатов

Привет. Есть андроид ресайклер с адаптером. Есть несколько вьютайпов. Вьютайпы

возвращаются в зависимости от предварительных вычислений. Проблема: вываливаюсь с ошибкой:
FullCalculationsHistoryAdapter$RawCalculationDayBeforeViewHolder cannot be cast to ru.sberbank.mobile.feature.efs.businessidea.view.FullCalculationsHistoryAdapter$RawCalculationViewHolder

В коде это выглядит так:
override fun getItemViewType(position: Int): Int {
return when (something) {
0 -> {
when (data[position].isFinished) {
true -> TYPE_FINISHED
else -> TYPE_RAW
}
}
1 -> {
when (data[position].isFinished) {
true -> TYPE_FINISHED_DAY_BEFORE
else -> TYPE_RAW_DAY_BEFORE
}
}
else -> UNDEFINED_TYPE
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
context = parent.context
return when (viewType) {
TYPE_RAW -> RawCalculationViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.bi_item_full_history_raw_card, parent, false)
)
TYPE_RAW_DAY_BEFORE -> RawCalculationDayBeforeViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.bi_item_full_history_raw_day_before_card, parent, false)
)
TYPE_FINISHED_DAY_BEFORE -> FinishedCalculationDayBeforeViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.bi_item_full_history_finished_day_before_card, parent, false)
)
else -> FinishedCalculationViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.bi_item_full_history_finished_card, parent, false)
)
}
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (getItemViewType(position)) {
TYPE_RAW -> {
holder as RawCalculationViewHolder
inflateRawType(data[position], holder)
}
TYPE_FINISHED -> {
holder as FinishedCalculationViewHolder
inflateFinishedType(data[position], holder)
}
TYPE_FINISHED_DAY_BEFORE -> {
holder as FinishedCalculationDayBeforeViewHolder
inflateFinishedTypeDayBefore(data[position], holder)
}
TYPE_RAW_DAY_BEFORE -> {
holder as RawCalculationDayBeforeViewHolder
inflateRawTypeDayBefore(data[position], holder)
}
}
}


Тыкните пальцем, что не так?

13 ответов

24 просмотра

тут мне кажется и так понятно

Павел- Автор вопроса

5 тип не должен никогда появляться. и если расчеты привели к нему - не должен рендериться. Я конечно попробую сейачс его втащить, ради эксперимента

ты гарантируешь, что именно 5 тип не пролетел в ветку else в onCreateViewHolder?

Павел- Автор вопроса

да

Павел- Автор вопроса

не помогло

переделай под абстрактный viewHolder, а все ViewHolder от него наследуй

Павел- Автор вопроса

что это даст? сейчас они у меня наследуются от RecyclerView.ViewHolder. Появится другой, который будет прокладкой между текущим РВ.ВХ и реализациями. Но проблема кастования никуда не уйдет. Или я чего-то не понимаю?

зачем ты вообще кастуешь? Чтобы получить доступ к разным inflaterRaweType, inflateFinishedType?

Павел- Автор вопроса

у меня разные ViewHolder реализации привязаны к разным вьюшкам(лейаутам) если я не кастану holder, я не смогу достучаться до полей. Гайды говорят о том же самом

https://pastebin.com/KG8wAzkK на DiffUtil, но легко можно на ListAdapter переписать, чтобы использовать AsyncDiffUtil

Павел- Автор вопроса

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

Я имел ввиду, что в примере DiffUtil, но ты можешь использовать что угодно, вплоть до NotifyData....

Павел- Автор вопроса

Спасибо. Помогло!

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта