BaseRecyclerViewAdapterHelper icon indicating copy to clipboard operation
BaseRecyclerViewAdapterHelper copied to clipboard

v4版本BaseMultiItemAdapter增加diff支持(临时解决)

Open luke-li-n opened this issue 1 year ago • 3 comments

v4版本BaseMultiItemAdapter如何支持Differ?

luke-li-n avatar Jul 08 '24 07:07 luke-li-n

+1

Suguiqiang avatar Aug 13 '24 02:08 Suguiqiang

同问

xiangsss avatar Aug 23 '24 07:08 xiangsss

临时解决方案: 使用现有的BaseDifferAdapter 自己实现多类型逻辑

MultiItemProvider

abstract class MultiItemProvider<T, VH : RecyclerView.ViewHolder> {
    abstract fun onBind(holder: VH, position: Int, item: T?)
    abstract fun onCreate(context: Context, parent: ViewGroup, viewType: Int): VH
}

Adapter

class DifferAdapter() :BaseDifferAdapter<UiData, RecyclerView.ViewHolder>(DiffCallBack()) {
    private val textMessageItemProvider =
        object : MultiItemProvider<UiData, TextViewHolder>() {
            override fun onBind(holder: TextViewHolder, position: Int, item: UiData?) {

            }

            override fun onCreate(
                context: Context, parent: ViewGroup, viewType: Int
            ): TextViewHolder{
                return TextViewHolder(parent)
            }
        }
    private val messageItemProviders = mapOf(
        SupportType.Text.type to textItemProvider,
        SupportType.Unknown.type to unknownItemProvider
    )

    override fun getItemViewType(position: Int, list: List<UiData>): Int {
        val item = getItem(position)
        return item?.messageType?.type ?: SupportType.Unknown.type
    }

    override fun onCreateViewHolder(
        context: Context,
        parent: ViewGroup,
        viewType: Int
    ): RecyclerView.ViewHolder {
        val provider: MultiItemProvider<UiMessage, out RecyclerView.ViewHolder> =
            messageItemProviders[viewType]
                ?: throw IllegalArgumentException("No provider found for message type: ${viewType}")
        return provider.onCreate(parent.context, parent, viewType)
    }

    override fun onBindViewHolder(
        holder: RecyclerView.ViewHolder,
        position: Int,
        item: UiData?
    ) {
        val provider: MultiItemProvider<UiMessage, out RecyclerView.ViewHolder> =
            messageItemProviders[item?.messageType?.type]
                ?: throw IllegalArgumentException("No provider found for message type: ${item?.messageType?.type}")
        @Suppress("UNCHECKED_CAST")
        (provider as MultiItemProvider<UiMessage, RecyclerView.ViewHolder>).onBind(
            holder,
            position,
            item
        )
    }
}

luke-li-n avatar Oct 16 '24 10:10 luke-li-n

新版本4.2.2已经解决

limuyang2 avatar Sep 17 '25 03:09 limuyang2

4.2.3版本,BaseMultiItemAdapter的构造函数无法传入AsyncDifferConfig,所以并没有解决

KittenBall avatar Sep 17 '25 06:09 KittenBall

新版本4.2.2已经解决

4.3.0仍未解决

KittenBall avatar Oct 09 '25 09:10 KittenBall