package com.yoesuv.myheterogeneous.adapters import android.view.LayoutInflater import android.view.ViewGroup import androidx.databinding.DataBindingUtil import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.yoesuv.myheterogeneous.R import com.yoesuv.myheterogeneous.databinding.ItemImageBinding import com.yoesuv.myheterogeneous.databinding.ItemTextBinding import com.yoesuv.myheterogeneous.models.ImageModel import com.yoesuv.myheterogeneous.models.TextModel import com.yoesuv.myheterogeneous.viewmodels.ItemImageViewModel import com.yoesuv.myheterogeneous.viewmodels.ItemTextViewModel class MyListAdapter: ListAdapter<Any, RecyclerView.ViewHolder>(DIFF_CALLBACK) { companion object { const val ITEM_IMAGE = 0 const val ITEM_TEXT = 1 val DIFF_CALLBACK = object : DiffUtil.ItemCallback<Any>() { override fun areContentsTheSame(oldItem: Any, newItem: Any): Boolean { if (oldItem is ImageModel && newItem is ImageModel) { return oldItem.name == newItem.name } else if (oldItem is TextModel && newItem is TextModel) { return oldItem.fullName == newItem.fullName } else { return true } } override fun areItemsTheSame(oldItem: Any, newItem: Any): Boolean { return oldItem == newItem } } } override fun getItemViewType(position: Int): Int { return if (getItem(position) is ImageModel) { ITEM_IMAGE } else { ITEM_TEXT } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { if (viewType == ITEM_IMAGE) { val binding: ItemImageBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.context), R.layout.item_image, parent, false) return ItemImageViewHolder(binding) } else { val binding: ItemTextBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.context), R.layout.item_text, parent, false) return ItemTextViewHolder(binding) } } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { if (holder is ItemImageViewHolder) { val imageModel = getItem(holder.adapterPosition) as ImageModel holder.bindData(imageModel) } else if (holder is ItemTextViewHolder) { val textModel = getItem(holder.adapterPosition) as TextModel holder.bindData(textModel) } } class ItemImageViewHolder(private val binding: ItemImageBinding) : RecyclerView.ViewHolder(binding.root) { fun bindData(imageModel: ImageModel) { binding.itemImage = ItemImageViewModel(imageModel) binding.executePendingBindings() } } class ItemTextViewHolder(private val binding: ItemTextBinding) : RecyclerView.ViewHolder(binding.root) { fun bindData(textModel: TextModel) { binding.itemText = ItemTextViewModel(textModel) binding.executePendingBindings() } } }