Listadapter中使用多个Viewholder的正确方法

had*_*ard 11 android listadapter android-recyclerview

我正在遵循本教程并尝试使用多个 ViewHolder。一个示例用例是消息应用程序,其中 recyclerview 必须以不同的布局显示发送的消息和接收的消息。我通过以下解决方案得到了它:

class MyEntityDiffCallback : DiffUtil.ItemCallback<MyEntity>() {
    override fun areItemsTheSame(oldItem: MyEntity, newItem: MyEntity): Boolean {
        return oldItem.id == newItem.id
    }

    override fun areContentsTheSame(oldItem: MyEntity, newItem: MyEntity): Boolean {
        return oldItem == newItem
    }

}

class MyAdapter :
    ListAdapter<MyEntity, MyAdapter.MyAbstractViewHolder>(
        MyEntityDiffCallback()
    ) {

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): MyAbstractViewHolder {
        if (viewType == 1){
            return MyViewHolder1.from(parent)
        }else{
            return MyViewHolder2.from(parent)
        }
    }

    override fun onBindViewHolder(holder: MyAbstractViewHolder, position: Int) {
        val item = getItem(position)
        holder.bind(item)
    }

    override fun getItemViewType(position: Int): Int {
        val item = getItem(position)
        if(item.someCounter > 5){
            return 1
        }else{
            return 0
        }
    }

    abstract class MyAbstractViewHolder(val binding: ViewDataBinding) :
        RecyclerView.ViewHolder(binding.root) {
        abstract fun bind(item: MyEntity)
    }

    class MyViewHolder2 private constructor(binding: Item2Binding) :
        MyAbstractViewHolder(binding) {

        override fun bind(
            item: MyEntity
        ) {
            val binding = binding as Item2Binding
            binding.message = item
            binding.executePendingBindings()
        }

        companion object {
            fun from(parent: ViewGroup): MyViewHolder2 {
                val layoutInflater = LayoutInflater.from(parent.context)
                val binding =
                    Item2Binding.inflate(layoutInflater, parent, false)
                return MyViewHolder2(binding)
            }
        }
    }

    class MyViewHolder1 private constructor(binding: Item1Binding) :
        MyAbstractViewHolder(binding) {

        override fun bind(
            item: MyEntity
        ) {
            val binding = binding as Item1Binding
            binding.message = item
            binding.executePendingBindings()
        }

        companion object {
            fun from(parent: ViewGroup): MyViewHolder1 {
                val layoutInflater = LayoutInflater.from(parent.context)
                val binding =
                    Item1Binding.inflate(layoutInflater, parent, false)
                return MyViewHolder1(binding)
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

这是应该实施的方式吗?我不确定绑定方法中绑定值的转换。或者是否有其他好的做法可以使用列表适配器和数据绑定来解决此问题?