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() } }
- Al utilizar tanto publishOn como subscribeOn en un flujo, no ocurre nada
- Gradle Build falla con el nuevo Gradle 3.0.0
- El escáner Bluetooth Low Energy parece funcionar correctamente pero no encuentra dispositivos
- Kotlin lambdas sin usar objects
- kotlin 'onCreate' no anula nada
- Variables en Kotlin, diferencias con Java. var vs val?
- Kotlin: Suma de BigDecimal en una list
- Spring MVC Error 404 Bad Request Kotlin
- Kotlin: Obtiene la superclass del object de la class - error de inferencia del object
- ¿Cuál es la mejor forma de manejar situaciones nulas en Kotlin al extender una class Java?
- Kotlin String to Int array
- Mejora en el análisis de Java / Kotlin JSON
- Cómo verificar el vacío lambda en kotlin
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]) }
- Kotlin getParcelableArray del set de bashs no puede convertirlo en tipo personalizado
- Intellij IDEA Kotlin Android Theme.AppCompat No se encontraron resources