Рефакторинг моего класса зрителей в Котлине

У меня есть список ресайклеров, который содержит много разных типов представлений. Достаточно легко использовать привязку данных без необходимости объявлять макет и назначение в узле просмотра, однако я получаю много кода билоплантов, чтобы просто создавать разные держатели данных с привязкой данных, есть ли способ избавиться от них?

class ViewHolder1 private constructor( val binding: ViewHolder1LayoutBinding ): RecyclerView.ViewHolder(binding.root) { companion object { fun create(parent: ViewGroup): RecyclerView.ViewHolder { val inflater = LayoutInflater.from(parent.context) val binding = ViewHolder1LayoutBinding.inflate(inflater, parent, false) return ViewHolder1(binding) } } fun bind(viewModel: ViewHolder1ViewModel) { binding.viewModel = viewModel binding.executePendingBindings() } } 

kotlin поддерживает привязку вида, поэтому не нужно делать другие вещи для привязки. Просто выполните шаги, и вы сможете получить доступ к представлению по его идентификатору, определенному в макете xml.

В графе уровня приложения добавьте следующее

 apply plugin: 'kotlin-android-extensions' 

Импорт

 import kotlinx.android.synthetic.main.<layout_file>.view.* 

Просто просмотрите этот класс для демонстрации

 class NotificationHolder(itemView: View?, listener: NotificationItemListener) : RecyclerView.ViewHolder(itemView) { init { itemView?.setOnClickListener { listener.onNotificationItemClicked(adapterPosition) } } fun bind(notificationModel: NotificationModel) { val titleArray = notificationModel.title.split("#".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() itemView.tvNotificationTitle.text = titleArray[0] itemView.tvNotificationDetails.text = notificationModel.message itemView.tvNotificationTime.text = notificationModel.formattedTime Glide.with(itemView.context).load(ServiceHandler.BASE_URL + notificationModel.icon).dontAnimate().diskCacheStrategy(DiskCacheStrategy.SOURCE).error(R.drawable.user_default_logo).into(itemView.imageView) if (CommonUtils.lastNotificationTime < notificationModel.date) { itemView.card.setCardBackgroundColor(Color.parseColor("#ffffff")) } else { itemView.card.setCardBackgroundColor(Color.parseColor("#f2f2f2")) } } } 

В адаптере вы можете переопределить

 override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder { return if (viewType == 0 || viewType == 3) { NotificationHolder(LayoutInflater.from(parent?.context).inflate(R.layout.item_notification, parent, false), this) } else { NotificationListHeaderHolder(LayoutInflater.from(parent?.context).inflate(R.layout.item_notification_header, parent, false)) } } override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) { (holder as? NotificationHolder)?.bind(notificationList[position]) (holder as? NotificationListHeaderHolder)?.bind(notificationList[position]) }