Bonne journée! Utilisation de Kotlin
1.1.51 dans Android Studio 3.0
, en ciblant Android API 26
pour créer RecyclerView
avec la prochaine ViewHolder
, mais en recevant une erreur lors de la construction du projet:
Incompatibilité de type: le type inféré est View! mais TextView était attendu
Donc, je ne peux pas trouver TextView
directement dans la variable ViewHolder
, mais trouvé autour du chemin - trouver la vue et après cette distribution avec as TextView
comme vous pouvez le voir dans le code de holder.
textView. Ne semble pas si bon, alors existe-t-il des solutions pour éviter cette erreur ou s'agit-il d'un bogue? Le code de RecyclerView
. Adapter:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.custom_item_view, parent, false)
return VH(view)
}
override fun onBindViewHolder(holder: VH, position: Int) {
val event: TimelineEvent = items[position]
// does not work because of error in VH class
holder.timeView.text = event.time
// works
(holder.textView as TextView).text = event.text
}
class VH(itemView: View) : RecyclerView.ViewHolder(itemView) {
// error: Type mismatch: inferred type is View! but TextView was expected
val timeView: TextView = itemView.findViewById(R.id.timeline_item_time)
// works fine
val textView: View = itemView.findViewById(R.id.timeline_item_text)
}
On dirait que vous n'êtes pas encore au niveau 26 ou plus récent de l'API. C'est à ce moment-là que findViewById
a été modifié pour qu'il retourne un T
générique au lieu de la classe View
de base, ce qui vous permet de l'utiliser à partir de Kotlin de ces manières .
Vous pouvez convertir manuellement le résultat de l'appel findViewById
sous la forme @AlexTa suggérée dans la réponse autre réponse ou mettre à jour la version de votre bibliothèque de support vers 26
ou une version ultérieure - la dernière en date étant 27.0.0
. Ces nouvelles versions sont disponibles à partir du référentiel Maven de Google .
Vous avez juste besoin de convertir la vue trouvée en tant que type attendu, pour ce faire:
val timeView: TextView = itemView.findViewById(R.id.timeline_item_time) as TextView
ou
val timeView: TextView = itemView.findViewById<TextView>(R.id.timeline_item_time)