web-dev-qa-db-fra.com

Kotlin synthétique dans Adapter ou ViewHolder

Je suis nouveau à Kotlin. J'ai trouvé et essayé d'utiliser la méthode synthétique au lieu de la méthode agaçante findViewById dans ma classe Activity, mais j'ai trouvé "Si nous voulons appeler les propriétés synthétiques sur View (utile dans les classes d'adaptateur) , nous devrions également importer kotlinx.Android.synthetic.main.view. *. " Mais je n'arrive pas à comprendre comment cela fonctionne exactement? Y a-t-il des exemples?

64
busylee

Exemple simple tiré 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()
        }
    }
}

Pas besoin d'écrire

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

Juste

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

Simple et efficace!

77
Peter Zhao

Kotling 1.1.4 sur

Informations complémentaires: https://antonioleiva.com/kotlin-Android-extensions/

Vous devez donc les activer en vous ajoutant ceci build.gradle:

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

Depuis cette nouvelle version de Kotlin, les extensions Android ont incorporé de nouvelles fonctionnalités intéressantes: des caches dans n’importe quelle classe (qui inclut de manière intéressante ViewHolder)

Utilisation sur un ViewHolder (ou une classe personnalisée)

class ViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView), 
        LayoutContainer {

    fun bind(title: String) {
        itemTitle.text = "Hello Kotlin!"
    }
}
25
Dhaval Jivani

Vous avez besoin

import kotlinx.Android.synthetic.row_wall.view.*

Et plus tard, quelque chose du genre:

convertView.titleText.text = item.title

Le fait est que la vue. * Introduit des extensions à la classe View.

7
Zsolt Szatmari

Essayer

class CustomViewModel(val baseView: View) { val firstName = baseView.firstName val lastName = baseView.lastName }

La vue objet expose les vues ref: https://discuss.kotlinlang.org/t/unable-to-use-kotlin-Android-extension-in-adapter-class/289

6
hyena

Si vous utilisez la dernière version, vous ne devez pas y ajouter experimental = true.

au niveau du projet

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

Et au niveau de l'application Gradle

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

et dans les dépendances ..

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

et importer ci-dessous comme

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

et exemple

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
    }
}

où BaseViewHolder est

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

Cela signifie que vous devez placer cette ligne au début de votre fichier source:

import kotlinx.Android.synthetic.main.view.*

Alors maintenant, au lieu de, par exemple, findView(R.id.textView) as TextView, vous écririez simplement textView. Ce dernier est une propriété d'extension synthétique située dans le paquetage kotlinx.Android.synthetic.main.view, C'est pourquoi vous devez tout importer.

Il y a un tutoriel sur le site officiel , jetez un coup d'oeil.

1
Alexander Udalov

À titre d'information: La liaison de données est recommandée sur la synthèse pour les consultations de vue.

Commentaire d'un DA pour Android de Google sur Reddit

Hey! Developer Advocate for Android sur Google ici!

Je voulais ajouter un peu de contexte ici. Kotlin Extensions avec des vues synthétiques n’a jamais été intentionnellement "recommandé", bien que cela ne devrait pas être considéré comme une recommandation de ne pas les utiliser. S'ils travaillent pour vous, n'hésitez pas à continuer de les utiliser dans votre application!

Nous nous sommes éloignés d'eux (par exemple, nous ne les enseignons pas dans le cours Udacity) car ils exposent un espace de noms global d'identifiants qui n'est pas lié à la présentation et qui est en fait gonflé sans vérification des recherches non valides, ne concerne que Kotlin. N'exposez pas la nullabilité lorsque les vues ne sont présentes que dans certaines configurations. Tous ensemble, ces problèmes entraînent une augmentation du nombre de crash de l'API pour les Android applications.

En revanche, ils offrent une API légère qui peut aider à simplifier les recherches d’affichage. Dans cet espace, il convient également de jeter un coup d'œil à la liaison de données, qui effectue également des recherches automatiques de vues - et s'intègre également à LiveData pour mettre à jour automatiquement vos vues au fur et à mesure de l'évolution des données.

Aujourd'hui, il y a quelques options dans cet espace qui fonctionnent:

La liaison de données est la recommandation recommandée pour la consultation des vues, mais elle ajoute un peu de charge supplémentaire par rapport à Android Extensions Kotlin. Cela vaut la peine de jeter un coup d'œil pour voir si cela convient. Data Binding vous permet également d’observer que LiveData lie automatiquement les vues lorsque celles-ci changent. Par rapport à Kotlin Extensions, il ajoute une vérification de la compilation des recherches et de la sécurité des vues. Android Kotlin Extensions est Ce n’est pas officiellement recommandé (ce qui n’est pas la même chose que la recommandation contre). Il vient avec les problèmes mentionnés ci-dessus, donc pour notre code nous ne les utilisons pas. Butter Knife est une autre solution extrêmement populaire qui fonctionne aussi bien pour Kotlin Java Langage de programmation. En parcourant les commentaires ici, beaucoup de développeurs ont de la chance avec les extensions Kotlin. C’est génial - et nous garderons cette idée à l’esprit lorsque nous examinerons les moyens de continuer amélioration de nos API. Si vous n’avez pas examiné la liaison de données , décidément donner un coup de feu.

De plus, notre guide de style de code interne n'est pas destiné à être appliqué directement à l'extérieur de notre base de code. Par exemple, nous utilisons mPrefixVariables, mais il n’ya aucune raison pour que chaque application suive ce style.

0
user158