Kotlin类型不匹配:推断类型是查看! 但TextView是预期的

美好的一天! 在Android Studio 3.0使用Kotlin 1.1.51,针对Android API 26创建具有下一个ViewHolder RecyclerView ,但在构建项目时收到错误:

类型不匹配:推断类型是查看! 但TextView是预期的

所以我找不到TextView直接到ViewHolder变量,但发现周围的方式 – 查找视图和之后, as TextView投入,你可以看到holder.的代码holder. TextView中。 看起来不太好,所以有解决方案如何防止这个错误,或者它是一个错误? RecyclerView的代码:

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

您只需要按照预期的类型投下找到的视图即可:

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

要么

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

看起来你不在API级别26或更新。 那就是当findViewById被改变时,它将返回一个通用的T而不是基类View类,这使得你可以用这些方法从Kotlin中使用它。

您可以手动将findViewById调用的结果转换为另一个答案中建议的@AlexTa,也可以将支持库版本更新到26或更高版本 – 最新的当前版本是27.0.0 。 这些新版本可以从Google的Maven仓库获得 。