возвращаются в зависимости от предварительных вычислений. Проблема: вываливаюсь с ошибкой:
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)
}
}
}
Тыкните пальцем, что не так?
тут мне кажется и так понятно
5 тип не должен никогда появляться. и если расчеты привели к нему - не должен рендериться. Я конечно попробую сейачс его втащить, ради эксперимента
ты гарантируешь, что именно 5 тип не пролетел в ветку else в onCreateViewHolder?
да
не помогло
переделай под абстрактный viewHolder, а все ViewHolder от него наследуй
что это даст? сейчас они у меня наследуются от RecyclerView.ViewHolder. Появится другой, который будет прокладкой между текущим РВ.ВХ и реализациями. Но проблема кастования никуда не уйдет. Или я чего-то не понимаю?
зачем ты вообще кастуешь? Чтобы получить доступ к разным inflaterRaweType, inflateFinishedType?
у меня разные ViewHolder реализации привязаны к разным вьюшкам(лейаутам) если я не кастану holder, я не смогу достучаться до полей. Гайды говорят о том же самом
https://pastebin.com/KG8wAzkK на DiffUtil, но легко можно на ListAdapter переписать, чтобы использовать AsyncDiffUtil
дифф утилы для сравнения имеющихся данных, чтобы перерисовать список, когда в него придут новые данные с анимациями и красотой всякой. Тут же я говорю о первом рэндере, тут диффутилы не нужны, потому что данные подгрузятся один раз при старте активити
Я имел ввиду, что в примере DiffUtil, но ты можешь использовать что угодно, вплоть до NotifyData....
Спасибо. Помогло!
Обсуждают сегодня