【发布时间】:2021-12-31 18:39:59
【问题描述】:
几天前我开始了android开发。我实现了一个recyclerview,并且在recyclerview 适配器的OnBindViewHolder 方法中,我在recyclerview 项上使用了setOnClickListener。我的主要目标是在单击 recyclerview 项目时启动一个新活动,但是在以以下方式实现我的代码时我遇到了障碍:
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val clusterItem = datalist[position]
holder.clusterName.setText(clusterItem.name)
holder.clusterStrat.setText(clusterItem.strats)
holder.itemview.setOnClickListener() {
startActivity(Intent(holder.itemview.context,ClusterSearchActivity::class.java))
}
}
我在包含 startActivity 的行中有 3 个错误:
类型不匹配:推断类型为 Intent 但预期为 Context
没有为参数“intent”传递值
没有为参数“选项”传递值
在经历了多种解决方案后,我终于偶然发现了这个:https://www.titanwolf.org/Network/q/08ad14d9-cb9a-4b87-923b-f97089db769a/y
使用 context.startActivity(intent) 我像这样重写了我的代码:
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val clusterItem = datalist[position]
holder.clusterName.setText(clusterItem.name)
holder.clusterStrat.setText(clusterItem.strats)
holder.itemview.setOnClickListener() {
holder.itemview.context.startActivity(Intent(holder.itemview.context,ClusterSearchActivity::class.java)) }
}
现在我的代码终于可以运行了,但我似乎不明白为什么我必须使用 context.startActivity()。 我想了解什么时候可以像那样使用 startActivity() 以及什么时候需要使用 context.startActivity()。
【问题讨论】:
-
如果您了解 OOPS 的基础知识,那就没什么好理解的了。
startActivity是某个类的非静态方法,如果该类调用它,则需要一个 Object 。它是Context的一个方法,这就是为什么你需要上下文来调用它的原因,因为 Activity 是 Context 的孩子,所以你可以直接在 Activity 中使用它。 -
一个
Activity本身就是一个Context,所以你不需要使用context...,而RecyclerView 或其适配器不是,所以你需要访问一个有效的Context通过膨胀视图 (itemView.context)。
标签: android kotlin android-activity android-recyclerview