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!

  • SortedList IndexOutBoundsException: Inconsistencia detectada. La position del artículo no es válida al eliminar el último elemento
  • ¿Cómo agregar una image más como un button al final de mi RecyclerView en Android?
  • Compruebe si RecyclerView se desplaza hacia arriba (findFirstCompletelyVisibleItemPosition no funcionará)
  • Android solo estableceStackFromEnd solo si RecycleView / List es más grande que la pantalla
  • RecyclerView animation de elementos, se llama AnimationFinished, pero no está activado en AnimationStarted. ¿Por qué?
  • Android - Kotlin: el object debe declararse abstracto o implementar miembro abstracto
  • La vista de reciclador no se infló. Obteniendo el error "Sin adaptador conectado, omitiendo el layout"
  • Haga que los niños de RecyclerView coincidan con la altura de los padres cuando usan el constructor en lugar de inflar para crearlos
  • Cómo proteger el oyente de desplazamiento sin fin de un reciclador
  • Actualizando la Vista de Reciclador y Creando Parcelables para la rotation de la pantalla (¿Cuál es el mejor curso de acción aquí?)
  • ¿Por qué onclick en los ítems de RecyclerView se devuelve una identificación de artículo incorrecta?