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 ответов

19 просмотров

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

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

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

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

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

да

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

не помогло

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

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

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

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

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

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

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

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

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

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

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

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

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта