web-dev-qa-db-fra.com

Discordance de type Kotlin: le type inféré est View! mais TextView était attendu

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)
    }
5
Eduards Pozarickis

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 .

2
zsmb13

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)
1
AlexTa