我几天前开始了android开发。我实现了一个recyleerview,在recycleerview适配器的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,但上下文应为
没有为参数"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(([/strong>.
-
首先,Context是应用程序/对象的当前状态。
-
与有关应用程序环境的全局信息的接口。
-
这是一个抽象类,其实现由Android系统提供。
-
它允许访问特定于应用程序的资源,如颜色、字符串资源、数据库访问和类,以及调用应用程序级别的操作,如启动活动、广播和接收意图等。
-
上下文是活动、服务、应用程序等的基类如果在AppCompatActivity和Fragment内部进行检查。然后你可以在里面找到startActivity((方法。
在您的情况下:
在适配器中,如果您需要获得数据库访问权限,请使用字符串res,例如:context.getResources().getString(R.string.yourstring);
需要在运行时在视图上设置颜色,所以您需要应用程序/对象的当前状态是调用上下文,上下文是一个超类。
您可以在适配器中通过三种方式访问上下文。
-
将Context作为参数传递给Adapter,并将其保留为类字段。
-
当你需要的时候,使用依赖注入来注入上下文。我强烈建议你阅读它。例如:Android Hilt。
最后,
- 从任何View对象获取它。就像你做的那样。holder.itemview.conf
我希望这可能对你有帮助。
这是因为方法startActivity()
是Activity
类的成员,而不是RecyclerView
,所以它根本不存在。
顺便说一句,单击RecyclerView启动"活动"的更好方法是通过回调。