Kotlin类型不匹配:推断类型是View!但TextView是预料之中的

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)

zsm*_*b13 5

看来您还没有达到 API 级别 26 或更高版本。这时findViewById进行了更改,以便它返回泛型T而不是基类,这使您能够以这些方式View从 Kotlin 使用它。

findViewById您可以按照 @AlexTa 在其他答案中建议的方式手动转换调用结果,也可以将支持库版本更新为26或更高版本 - 目前最新的是27.0.0。这些新版本可从Google 的 Maven 存储库获取。


Ale*_*xTa 4

您只需将找到的视图转换为预期类型即可:

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)