Refactorizar mi class de espectadores en kotlin

Tengo una list de recicladores que contiene muchos types diferentes de vistas de artículos. Es bastante fácil usar databinding sin necesidad de declarar el layout y la asignación en el visualizador, sin embargo, termino con muchos códigos de biloplate para simplemente crear los diferentes visualizadores con databinding, ¿hay alguna forma de deshacerse de ellos?

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 admite vinculación de vista, por lo que no es necesario hacer otras cosas para la vista binding. Simplemente siga los pasos y podrá acceder a la vista por su id definido en el layout xml.

En gradle de nivel de aplicación, agregue lo siguiente

 apply plugin: 'kotlin-android-extensions' 

Vista de import

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

Solo revisa esta class para ver una demostración

 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")) } } } 

En el adaptador puede anular

 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]) } 
  • Cómo hacer doble pitido con ToneGenerator
  • Kotlin: ¿cómo devolver la instancia del service en ejecución en la carpeta?
  • ¿Cómo puedo llamar a los methods de extensión desde fuera de la class en la que están definidos?
  • Alcance de la variable definida en el encabezado de bucle for
  • ¿Por qué el comstackdor de Kotlin requiere el inicializador explícito de la propiedad var?
  • Inflado de disposition incondicional desde el adaptador de vista. kotlin
  • kotlin consiguiendo un suscriptor para observar un observable usando RxJava2
  • Kotlin - ¿Cómo crear una function de alias de RxJava flatmap ()?
  • En android kotlin utilizando la biblioteca paso a paso pasando los valores de botones de opción personalizados sobre múltiples fragments para ser usados ​​en una página de resumen
  • ¿Cómo llamar a una function de nivel superior desde un método o una function de extensión de la misma firma?
  • Funciones elementales en kotlin