drakeet / MultiType

Flexible multiple types for Android RecyclerView.
Apache License 2.0
5.76k stars 751 forks source link

在 ConcatAdapter 中,itemViewType获取错误导致的崩溃 #317

Open limuyang2 opened 3 years ago

limuyang2 commented 3 years ago

在 ConcatAdapter 中,MultiTypeAdapter 通过

types.getType<Any>(viewHolder.itemViewType)

在某些情况下会导致崩溃,出现数组越界,因为获得的 viewHolder.itemViewType 并不稳定,不会与 getItemViewType()返回值一一对应。

必须将 ConcatAdapter 配置中的 isolateViewTypes 参数设置为false(其默认值为 true)。但是设置为false之后,就会导致 ConcatAdapter 中所有 子AdapterViewHolder公用一个池子,不进行内部隔离。那这种就需要使用者,手动保持 每一个子AdaptergetItemViewType()返回值的唯一性。

个人认为,ConcatAdapter 默认会进行 ViewHolder的 itemType 隔离,那可能内部对ItemViewType进行了某种操作

limuyang2 commented 3 years ago

官方的写法是类似这样的:

when (holder) {
                is AHolder -> (holder as AHolder).bind(.....)
                is BHolder -> (holder as BHolder).bind(.....)
            }

但是本库极度依赖holder.itemViewType,尝试修改都没找到好的方式

drakeet commented 3 years ago

感谢反馈,目前不建议和 ConcatAdapter 一起使用,待近期适配 RV 1.2.0.

drakeet commented 3 years ago

看看是否和这个 issue 有关:https://issuetracker.google.com/issues/187339376

cooliceman commented 2 years ago

这个问题有新的进展么? 通过viewHolder的itemView添加自定义tag来保存multiTypeAdapter的viewType,取值时也通过tag来取值,规避viewholder.itemViewType和实际不一致问题.

530l commented 2 years ago

这是来自QQ邮箱的假期自动回复邮件。   您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。

kolyneh commented 1 year ago

同问,需要与ConcatAdapter一起使用,尝试各种方法无果。