web-dev-qa-db-ja.com

Kotlinタイプの不一致:推測されるタイプはViewです!しかし、TextViewは期待されていました

良い一日! Android Studio 3.0Kotlin 1.1.51を使用し、Android API 26をターゲットにして次のRecyclerViewViewHolderを作成しますが、プロジェクトのビルドでエラーが発生します。

タイプの不一致:推測されるタイプはビューです!しかし、TextViewは期待されていました

したがって、TextViewViewHolder変数に直接見つけることはできませんが、途中で見つけました-Viewを見つけ、その後、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)
    }
5

まだAPIレベル26以降ではないようです。そのとき、findViewByIdが変更されてベースのTクラスではなく汎用のViewが返されるようになりました。これにより、Kotlinから これらの方法

other answer で提案されている@AlexTaとしてfindViewById呼び出しの結果を手動でキャストするか、サポートライブラリを更新することができます26以降のバージョン-最新のものは現在27.0.0です。これらの新しいバージョンは、 GoogleのMavenリポジトリ から入手できます。

2
zsmb13

これを行うには、見つかったビューを期待されるタイプとしてキャストする必要があります。

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

または

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