MultiType icon indicating copy to clipboard operation
MultiType copied to clipboard

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

Open limuyang2 opened this issue 3 years ago • 6 comments

在 ConcatAdapter 中,MultiTypeAdapter 通过

types.getType<Any>(viewHolder.itemViewType)

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

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

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

limuyang2 avatar Apr 15 '21 09:04 limuyang2

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

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

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

limuyang2 avatar Apr 16 '21 03:04 limuyang2

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

drakeet avatar Apr 16 '21 09:04 drakeet

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

drakeet avatar Jun 03 '21 09:06 drakeet

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

cooliceman avatar Aug 19 '22 02:08 cooliceman

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

530l avatar Aug 19 '22 02:08 530l

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

kolyneh avatar Jun 09 '23 02:06 kolyneh