this is an adapter to control what buttons to show...
# codereview
m
this is an adapter to control what buttons to show in RecyclerView footer, added to
Concateadapter
Copy code
sealed class ButtonsAdapterType(val isEnabled: Boolean) {
    open fun areItemsTheSame(other: ButtonsAdapterType): Boolean = this == other
    open fun areContentsTheSame(oldItem: ButtonsAdapterType): Boolean = this == oldItem

    data class ReviewButtonItem(val enabled: Boolean) : ButtonsAdapterType(enabled)
    data class AddNewButtonItem(val enabled: Boolean) : ButtonsAdapterType(enabled)
    data class CheckOutButtonItem(val enabled: Boolean) : ButtonsAdapterType(enabled)
}

class OrderButtonsAdapter(private val navigation: Navigation) :
    ListAdapter<ButtonsAdapterType, RecyclerView.ViewHolder>(diffUtil) {

    companion object {
        private val diffUtil = object : DiffUtil.ItemCallback<ButtonsAdapterType>() {
            override fun areItemsTheSame(
                oldItem: ButtonsAdapterType,
                newItem: ButtonsAdapterType
            ): Boolean = newItem.areItemsTheSame(oldItem)

            override fun areContentsTheSame(
                oldItem: ButtonsAdapterType,
                newItem: ButtonsAdapterType
            ): Boolean = newItem.areContentsTheSame(oldItem)

        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return when (viewType) {
            ButtonsViewType.REVIEW.id -> GoToReviewPageViewHolder(parent)
            ButtonsViewType.CHECKOUT.id -> CheckOutButtonViewHolder(parent)
            ButtonsViewType.ADD_NEW.id -> AddItemButtonViewHolder(parent, navigation)
            else -> throw NotImplementedError()
        }
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val enabled = getItem(position).isEnabled
        when (holder) {
            is GoToReviewPageViewHolder -> holder.bind(enabled)
            is CheckOutButtonViewHolder -> holder.bind(enabled)
            is AddItemButtonViewHolder -> holder.bind(enabled)
        }
    }

    override fun getItemViewType(position: Int): Int {
        return when (getItem(position)) {
            is ButtonsAdapterType.AddNewButtonItem -> ButtonsViewType.ADD_NEW.id
            is ButtonsAdapterType.CheckOutButtonItem -> ButtonsViewType.CHECKOUT.id
            is ButtonsAdapterType.ReviewButtonItem -> ButtonsViewType.REVIEW.id
            else -> -1
        }
    }
}

private enum class ButtonsViewType(val id: Int) {
    REVIEW(100), CHECKOUT(200), ADD_NEW(300)
}
I did similar one for regular items, what do you think