tutorial studio recyclerview recycler example kotlin kotlin-android-extensions

studio - recyclerview android kotlin tutorial



Kotlin sintético en Adaptador o ViewHolder (7)

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 hay necesidad de 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!

Soy nuevo en kotlin. Encontré e intenté usar el método sintético en lugar del método molesto findViewById en mi clase Activity , pero encontré "Si queremos llamar a las propiedades sintéticas en View (útiles en clases de adaptador), también deberíamos importar kotlinx.android.synthetic .vista principal.*." ¿Pero no puedo entender cómo funciona exactamente? ¿Hay algún ejemplo?


Kotling 1.1.4 fuera

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

Por lo tanto, debe habilitarlos agregando esto a su 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: cachés en cualquier clase (que incluye interesante ViewHolder)

Usarlo en un ViewHolder (o cualquier clase 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 en la línea de:

convertView.titleText.text = item.title

El punto es que la vista. * Introduce extensiones a la clase Vista.


Si está utilizando la última versión l; .no tiene que agregar experimental = true.

en el nivel de proyecto Gradle

classpath ''org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.21''

Y en el nivel de aplicación Gradle

apply plugin: ''kotlin-android'' apply plugin: ''kotlin-android-extensions'' //These should be on the top of file.

y en dependencias ..

implementation ''org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.21''

e importar a continuación como

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

y ejemplo

import kotlinx.android.synthetic.main.item_animal.view.* class AnimalVH(parent: ViewGroup, layoutID: Int) : BaseViewHolder<Animal>(parent, layoutID) { override fun bindData(animal: Animal) { itemView.tv_animal.text = animal.title } }

donde BaseViewHolder es

abstract class BaseViewHolder<T>(parent: ViewGroup, layoutID: Int) : RecyclerView.ViewHolder( LayoutInflater.from(parent.context).inflate(layoutID, parent, false) ) { abstract fun bindData(model: T) }


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

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

Entonces, en lugar de, por ejemplo, findView(R.id.textView) as TextView , escribiría solo textView . Esta última es una propiedad de extensión sintética ubicada en el paquete kotlinx.android.synthetic.main.view , es por eso que debe importar todo desde ella.

Hay un tutorial en el sitio oficial , échale un vistazo.



FYI: el enlace de datos se recomienda sobre sintético para ver búsquedas.

Comentario de un DA para Android de Google en Reddit

¡Oye! Desarrollador Advocate para Android en Google aquí!

Quería agregar un poco de fondo aquí. Las extensiones de Kotlin con vistas sintéticas nunca fueron "recomendadas" intencionalmente, aunque eso no debe tomarse como una recomendación para no usarlas. Si están trabajando para ti, ¡no dudes en seguir usándolos en tu aplicación!

Nos hemos alejado de ellos (por ejemplo, no les enseñamos en el curso de Udacity) porque exponen un espacio de nombres global de identificadores que no está relacionado con el diseño que en realidad está inflado sin controles contra búsquedas no válidas, son solo Kotlin y don No exponga la nulabilidad cuando las vistas solo están presentes en alguna configuración. En conjunto, estos problemas hacen que la API aumente el número de bloqueos para las aplicaciones de Android.

Por otro lado, ofrecen una API ligera que puede ayudar a simplificar las búsquedas de vistas. En este espacio también vale la pena echar un vistazo a Data Binding, que también realiza búsquedas de vistas automáticas, además de integrarse con LiveData para actualizar automáticamente sus vistas a medida que cambian los datos.

Hoy en día, hay algunas opciones en este espacio que funcionan:

El enlace de datos es la recomendación para la búsqueda de vistas y el enlace, pero agrega un poco de sobrecarga en comparación con las extensiones de Android Kotlin. Vale la pena echarle un vistazo para ver si esta es una buena opción para su aplicación. El enlace de datos también le permite observar LiveData para enlazar vistas automáticamente cuando los datos cambian. En comparación con las extensiones de Kotlin, agrega la comprobación del tiempo de compilación de las búsquedas de vistas y la seguridad de los tipos. Android Kotlin Extensions no se recomienda oficialmente (que no es lo mismo que la recomendación en contra). Viene con los problemas mencionados anteriormente, por lo que para nuestro código no los estamos usando. Butter Knife es otra solución que es extremadamente popular y funciona tanto para Kotlin como para el lenguaje de programación Java. Leyendo los comentarios aquí hay muchos desarrolladores que están teniendo mucha suerte con Kotlin Extensions. Eso es genial, y algo lo tendremos en cuenta cuando busquemos formas de continuar mejorando nuestras API. Si no ha echado un vistazo a Data Binding, definitivamente inténtelo.

Además, nuestra guía de estilo de código interno no está destinada a aplicarse directamente fuera de nuestra base de código. Por ejemplo, usamos mPrefixVariables, pero no hay razón para que todas las aplicaciones sigan ese estilo.