Kotlin sintético en adaptador o ViewHolder

Soy nuevo en kotlin. He encontrado e intentado utilizar el método sintético en lugar del molesto método findViewById en mi class Activity , pero he encontrado "Si queremos llamar a las properties sintéticas en View (útil en las classs de adaptadores), también deberíamos importar kotlinx.android.synthetic .vista principal.*." Pero no puedo entender cómo funciona exactamente? ¿Hay algún ejemplo?

Ejemplo simple de https://github.com/antoniolg/Kotlin-for-Android-Developers

 import kotlinx.android.synthetic.item_forecast.view.* class ForecastListAdapter() : RecyclerView.Adapter<ForecastListAdapter.ViewHolder>() { class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { fun bindForecast(forecast: Forecast) { itemView.date.text = forecast.date.toDateString() } } } 

No es necesario escribir

 val view = itemView.findViewById(R.id.date) as TextView view.text = forecast.date.toDateString() 

Sólo

 itemView.date.text = forecast.date.toDateString() 

Simple y efectivo!

Kotling 1.1.4 fuera

Más información: https://antonioleiva.com/kotlin-android-extensions/

Por lo tanto, debe habilitarlos agregándole esto a build.gradle:

 apply plugin: 'org.jetbrains.kotlin.android.extensions' androidExtensions { experimental = true } 

Desde esta nueva versión de Kotlin, las extensiones de Android han incorporado algunas características nuevas e interesantes: cachings en cualquier class (que curiosamente incluye ViewHolder)

Utilizándolo en un ViewHolder (o cualquier class personalizada)

 class ViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView), LayoutContainer { fun bind(title: String) { itemTitle.text = "Hello Kotlin!" } } 

Necesitas

 import kotlinx.android.synthetic.row_wall.view.* 

Y luego algo parecido a:

 convertView.titleText.text = item.title 

El punto es que la vista. * Introduce extensiones a la class View.

Significa que debe colocar esta línea al comienzo de su file fuente:

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

Así que ahora, en lugar de, por ejemplo, findView(R.id.textView) as TextView , escribirías solo textView . Este último es una propiedad de extensión sintética ubicada en el package kotlinx.android.synthetic.main.view , por eso tiene que importar todo desde allí.

Hay un tutorial en el sitio oficial , eche un vistazo.

  • Usar las extensiones de resources de Kotlin para Android usando solo Maven
  • Parsing xml kotlin android
  • ¿Integración de Kotlin en Java Code?
  • Kotlin: configuration de un boolean privado en class Java a través de una class de datos en Kotlin. ¿Por qué no puedo hacer esto?
  • No se pueden agregar los fragments usando la function de Extensión de Kotlin
  • Clases de Kotlin sin llaves
  • La class Kotlin Custom View implementa una interfaz que no se puede resolver en `: app: compileDebugKotlinAfterJava`. La versión idéntica de Java funciona bien
  • Métodos estáticos como en la aplicación de Android con kotlin
  • Extremadamente lento en autocompletado y análisis de código para proyectos Kotlin en Intellij IDEA
  • Comunicación de extensión Kotlin-android entre classs similar a la comunicación con otros fragments
  • Android ProgressBar indeterminado no aparece