Edu*_*kis 5 android kotlin android-recyclerview
美好的一天!使用Kotlin1.1.51 in Android Studio 3.0,目标Android API 26是RecyclerView使用next 创建ViewHolder,但在构建项目时收到错误:
类型不匹配:推断类型是View!但TextView是预料之中的
所以我找不到TextView直接ViewHolder变量,但找到了方法 - as TextView在holder.textView 的代码中可以看到查找和之后的转换.看起来不那么好,那么有没有解决方法如何防止这个错误或者它是一个错误?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)
}
Run Code Online (Sandbox Code Playgroud)
看来您还没有达到 API 级别 26 或更高版本。这时findViewById进行了更改,以便它返回泛型T而不是基类,这使您能够以这些方式View从 Kotlin 使用它。
findViewById您可以按照 @AlexTa 在其他答案中建议的方式手动转换调用结果,也可以将支持库版本更新为26或更高版本 - 目前最新的是27.0.0。这些新版本可从Google 的 Maven 存储库获取。
您只需将找到的视图转换为预期类型即可:
val timeView: TextView = itemView.findViewById(R.id.timeline_item_time) as TextView
Run Code Online (Sandbox Code Playgroud)
或者
val timeView: TextView = itemView.findViewById<TextView>(R.id.timeline_item_time)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8574 次 |
| 最近记录: |