extensiones kotlin-android en ViewHolder

class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { fun bindata(text: SingleText){ itemView.title.text = text.title itemView.desc.text = text.desc } } 

al igual que este código, ¿Kotlin tiene algún caching en las extensiones de Android?

cuando descompilo el bytecode de kotlin

 public final void bindata(@NotNull SingleText text) { Intrinsics.checkParameterIsNotNull(text, "text"); ((AppCompatTextView)this.itemView.findViewById(id.title)).setText((CharSequence)text.getTitle()); ((AppCompatTextView)this.itemView.findViewById(id.desc)).setText((CharSequence)text.getDesc()); } 

significa que cuando llamé a binData en Adapter.onBindViewHolder (), se llamará findViewById cada vez

Esto aumenta significativamente la pérdida de performance y no logra el propósito de la reutilización del layout

¿Kotlin tiene alguna lógica de caching en las extensiones android con ViewHolder?

Ver el almacenamiento en caching en un ViewHolder o cualquier class personalizada solo es posible desde Kotlin 1.1.4 y actualmente se encuentra en la etapa experimental.

  1. Actualice su versión de Kotlin en su file build.gradle de nivel de raíz

classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.4-3"

  1. Agregue estas líneas en su aplicación build.gradle :

androidExtensions { experimental = true }

  1. ViewHolder su class LayoutContainer de LayoutContainer . LayoutContainer es una interfaz disponible en el package kotlinx.android.extensions .

  2. Agregue las importaciones a continuación, donde view_item es el nombre del layout.

import kotlinx.android.synthetic.main.view_item.* import kotlinx.android.synthetic.main.view_item.view.*

Toda la class ViewHolder ve así:

 class ViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView), LayoutContainer { fun bind(title: String) { itemTitle.text = "Hello Kotlin!" // itemTitle is the id of the TextView in the layout } } 

El código de Java descomstackdo muestra que esta class usa el caching para las Vistas:

  public final void bind(@NotNull String title) { Intrinsics.checkParameterIsNotNull(title, "title"); ((TextView)this._$_findCachedViewById(id.itemTitle)).setText((CharSequence)"Hello Kotlin!"); } 

Otras lecturas: KEEP propuesta , un tutorial increíble .

Desde mi entendimiento, kotlin-android-extensions es solo una extensión importada estáticamente (códigos generados) para replace View.findViewById.

Le recomendaría que almacene las references en su titular de la vista.

 class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val title: TextView = itemView.title val desc: TextView = itemView.desc fun bindata(text: SingleText){ title.text = text.title desc.text = text.desc } } 

¡Uno de los beneficios de este enfoque es que cualquier desajuste de tipo se descubrirá en time de compilation!

  • RecyclerView Items no aparece hasta que lo desploop
  • Color de background e image arrastrando en Scroll en recyclerView Android usando Group Adaptor
  • ¿Cómo uso un onItemLongClickListener en mi actividad en Android?
  • Cómo integrar Admob Native Advanced Ads usando Kotlin - Android
  • RecyclerView con múltiples layouts es desigual
  • ¿Cómo cambiar el color de background de una vista de carta cuando se selecciona?
  • Cómo proteger el oyente de desplazamiento sin fin de un reciclador
  • Intentando crear un reciclador simple en Kotlin, pero el adaptador no se está aplicando correctamente
  • java.lang.IllegalStateException: TextView no debe ser nulo (Android / Kotlin)
  • Android solo estableceStackFromEnd solo si RecycleView / List es más grande que la pantalla
  • kotlin RecyclerViewAdapter IndexOutOfBoundException