美好的一天!
在Kotlin
中使用Android Studio 3.0
1.1.51,定位Android API 26
以使用下一个RecyclerView
创建ViewHolder
,但在构建项目时收到错误:
类型不匹配:推断类型是View!但TextView是预期的
所以我找不到TextView
直接发送到ViewHolder
变量,但找到了解决方法 - 找到View并使用as TextView
进行投射后,如holder.
代码中所示1}}的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)
}
答案 0 :(得分:2)
您似乎还没有使用API级别26或更新版本。这是findViewById
更改后的时间,以便返回通用T
而不是基础View
类,这使您可以在these ways中使用Kotlin。
您可以手动将findViewById
来电的结果转换为other answer中建议的@AlexTa,也可以将支持库版本更新为26
或更高版本 - 当前最新版本是27.0.0
。这些新版本可从Google's Maven repository获得。
答案 1 :(得分:1)
您只需将找到的视图转换为预期类型即可:
val timeView: TextView = itemView.findViewById(R.id.timeline_item_time) as TextView
或
val timeView: TextView = itemView.findViewById<TextView>(R.id.timeline_item_time)
答案 2 :(得分:0)
这个问题已经有好几年了,但也许我的回答会帮助那些像我一样犯了一个简单错误后遇到这个问题的人。
我遇到了类似的错误(我的错误是 inferred type is View but ImageView was expected
),当我阅读这里的答案时,我意识到我有两个由 Android Studio 中的主/详细模板生成的布局。我已将 id/item_detail
中的元素 (TextView
) 从 ImageView
更改为 res/layout/fragment_item_detail.xml
,但我仅针对常规布局执行此操作,而不针对 {{1} 中的布局执行此操作}}
由于相同的 id 在两个布局中具有不同的类型,因此绑定无法将关联的视图转换为 res/layout-sw600dp/fragment_item_detail.xml
。相反,它返回到共同的父级,即 ImageView
。
将两个元素都更改为 View
(无论如何这是我想要的)修复了错误。
因此,为避免此类错误,您需要做的一件事是确保同名布局文件中具有相同 id 的布局元素在所有布局文件夹中具有相同的类。