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