良い一日! Android Studio 3.0
でKotlin
1.1.51を使用し、Android API 26
をターゲットにして次のRecyclerView
でViewHolder
を作成しますが、プロジェクトのビルドでエラーが発生します。
タイプの不一致:推測されるタイプはビューです!しかし、TextViewは期待されていました
したがって、TextView
をViewHolder
変数に直接見つけることはできませんが、途中で見つけました-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)
}
まだAPIレベル26以降ではないようです。そのとき、findViewById
が変更されてベースのT
クラスではなく汎用のView
が返されるようになりました。これにより、Kotlinから これらの方法 。
other answer で提案されている@AlexTaとしてfindViewById
呼び出しの結果を手動でキャストするか、サポートライブラリを更新することができます26
以降のバージョン-最新のものは現在27.0.0
です。これらの新しいバージョンは、 GoogleのMavenリポジトリ から入手できます。
これを行うには、見つかったビューを期待されるタイプとしてキャストする必要があります。
val timeView: TextView = itemView.findViewById(R.id.timeline_item_time) as TextView
または
val timeView: TextView = itemView.findViewById<TextView>(R.id.timeline_item_time)