webentwicklung-frage-antwort-db.com.de

Kotlin-Typ-Konflikt: Der abgeleitete Typ ist View! aber TextView wurde erwartet

Guten Tag! Verwenden Sie Kotlin 1.1.51 in Android Studio 3.0, richten Sie Android API 26 für die Erstellung von RecyclerView mit nächster ViewHolder ein, erhalten jedoch einen Fehler beim Erstellen des Projekts: 

Typenkonflikt: Der abgeleitete Typ ist View! aber TextView wurde erwartet

Also kann ich TextView nicht direkt in ViewHolder finden, sondern um way - find View und danach mit as TextView suchen, wie Sie im Code für holder.textView sehen können. Sieht nicht so gut aus, gibt es Lösungen, wie man diesen Fehler verhindern kann oder ist es ein Fehler? Der Code von 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

Es scheint, als wären Sie noch nicht auf API-Ebene 26 oder neuer. In diesem Fall wurde findViewById so geändert, dass eine generische T anstelle der BasisvariableView zurückgegeben wird, sodass Sie sie von Kotlin aus auf diese Weise verwenden können.

Sie können das Ergebnis des findViewById-Aufrufs entweder manuell als @AlexTa in der other answer vorschlagen, oder Sie können die Version Ihrer Unterstützungsbibliothek auf 26 oder höher aktualisieren - der neueste ist 27.0.0. Diese neuen Versionen sind im Google Maven-Repository verfügbar.

2
zsmb13

Sie müssen nur die gefundene Ansicht als erwarteten Typ umwandeln:

val timeView: TextView = itemView.findViewById(R.id.timeline_item_time) as TextView

oder

val timeView: TextView = itemView.findViewById<TextView>(R.id.timeline_item_time)
1
AlexTa