2015-10-23 1 views
32

Je suis nouveau dans kotlin. J'ai trouvé et essayé d'utiliser la méthode synthétique au lieu de la méthode ennuyeuse 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 de l'adaptateur), nous devons également importer kotlinx.android.synthetic .vue principale.*." Mais je ne peux pas comprendre comment cela fonctionne exactement? Y a-t-il des exemples?Kotlin synthétique dans l'adaptateur ou ViewHolder

Répondre

1

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 juste textView. Ce dernier est une propriété d'extension synthétique située dans le paquet kotlinx.android.synthetic.main.view, c'est pourquoi vous devez tout importer. Il y a un tutorial on the official site, regardez.

+1

Je l'ai vu encore. Je le fais pour mon activité, comme je l'ai décrit ci-dessus. Mais comment je peux l'utiliser à l'intérieur des dérivés BaseAdapter? – busylee

+1

Eh bien, fondamentalement, vous pouvez appeler la méthode 'findViewById()' sur 'View', comme' holder.findViewById (R.id.name) '. Avec Kotlin Android Extensions, vous pouvez écrire 'holder.name'. Supposons que ce code est écrit dans un 'getView()' fonction: 'base val = inflater.inflate (R.layout.list_item, parent, false)' ' base.name.text = "John Smith"' – yanex

+0

Mais Et si je devais utiliser plusieurs porte-vues avec différentes dispositions? Comment puis-je le réaliser avec du synthétique?Parce que nous devons utiliser un "lien synthétique" spécifique pour chaque mise en page et j'ai plusieurs mises en page avec des identifiants similaires. –

44

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

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!

+1

ok, cela peut être une question stupide, mais d'où vient la référence 'itemView'? –

+0

ok, j'ai remarqué que le .view me manquait. partie de l'importation. Maintenant, la référence itemView est disponible, et il semble provenir de la classe RecyclerView.ViewHolder dans le package de support v7. Tks –

+0

ouais, je n'ai pas vu itemview être créé? –

4

Vous devez

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

Et plus tard, quelque chose le long des lignes de:

convertView.titleText.text = item.title 

Le point est que le point de vue * introduit des extensions à la classe View..

8

Kotling sur 1.1.4

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

Alors vous avez besoin pour leur permettre d'ajouter ceci à vous build.gradle:

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

Depuis cette nouvelle version de Kotlin , les extensions Android ont incorporé quelques nouvelles fonctionnalités intéressantes: caches dans n'importe quelle classe (ce qui inclut de façon intéressante ViewHolder)

l'aide sur un ViewHolder (ou toute classe personnalisée)

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

    fun bind(title: String) { 
     itemTitle.text = "Hello Kotlin!" 
    } 
} 
+2

Ajout à cette information: Selon Kotlin 1.1.4 la fonctionnalité est expérimentale et doit être activée sur le fichier build.gradle – Miquel