startActivity() 与 context.startActivity()

startActivity() vs context.startActivity()

几天前我开始android开发。我实现了一个 recylerview,在 recyclerview 适配器的 OnBindViewHolder 方法中,我在 recyclerview 项目上使用了 setOnClickListener。我的主要目标是在单击 recyclerview 项目时启动一个新的 activity,但在按以下方式实现我的代码时我 运行 撞墙了:

     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'

没有为参数传递值 'options'

在经历了多种解决方案后,我终于偶然发现了这个: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()

那是因为方法 startActivity()Activity class 而不是 RecyclerView 的成员,它根本不存在。

顺便说一句,从 RecyclerView 单击开始 Activity 的更好方法是通过回调。

  1. 首先,Context是application/object.

    的当前状态
  2. 有关应用程序环境的全局信息的接口。

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

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

  5. 上下文是 Activity、服务、应用程序等的基础 class 如果您检查 AppCompatActivity 和 Fragment。 然后你可以在里面找到 startActivity() 方法。

你的情况:

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

需要在运行时在视图上设置颜色,因此您必须需要 application/object 的当前状态是调用上下文并且上下文是一个超级 class.

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

  1. 将上下文作为参数传递给适配器并将其保留为 class 字段。

  2. 使用依赖注入,在需要的时候注入Context。我强烈建议阅读 it.e.g: Android Hilt.

最后,

  1. 从任何视图对象中获取它。就像你做的一样。 holder.itemview.context.

希望对您有所帮助。