startActivity() vs context.startActivity()



我几天前开始了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>.

  1. 首先,Context是应用程序/对象的当前状态。

  2. 与有关应用程序环境的全局信息的接口。

  3. 这是一个抽象类,其实现由Android系统提供。

  4. 它允许访问特定于应用程序的资源,如颜色、字符串资源、数据库访问和类,以及调用应用程序级别的操作,如启动活动、广播和接收意图等。

  5. 上下文是活动、服务、应用程序等的基类如果在AppCompatActivity和Fragment内部进行检查。然后你可以在里面找到startActivity((方法。

在您的情况下:

在适配器中,如果您需要获得数据库访问权限,请使用字符串res,例如:context.getResources().getString(R.string.yourstring);

需要在运行时在视图上设置颜色,所以您需要应用程序/对象的当前状态是调用上下文,上下文是一个超类。

您可以在适配器中通过三种方式访问上下文。

  1. 将Context作为参数传递给Adapter,并将其保留为类字段。

  2. 当你需要的时候,使用依赖注入来注入上下文。我强烈建议你阅读它。例如:Android Hilt。

最后,

  1. 从任何View对象获取它。就像你做的那样。holder.itemview.conf

我希望这可能对你有帮助。

这是因为方法startActivity()Activity类的成员,而不是RecyclerView,所以它根本不存在。

顺便说一句,单击RecyclerView启动"活动"的更好方法是通过回调。

最新更新