【问题标题】:Start Activity from RecycleView Adapter on click从 RecyclerView 适配器 onclick 启动 Activity
【发布时间】:2015-08-10 10:00:32
【问题描述】:

我从 CardView 适配器启动新活动时遇到问题,代码如下:

RVAdapter adapter = new RVAdapter(array_restaurants);
recList.setAdapter(adapter);

在适配器之后。我设置了一个 OnClickListener

personName.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                Context context = v.getContext();
                System.out.println("Context");
                System.out.println(context.toString());
                Intent intent = new Intent(v.getContext(), Restaurante.class);
                v.getContext().startActivity(intent);
            }
        });

当我在控制台中打印上下文时,一切看起来都很好,但是在应用程序停止工作之后。为什么?

非常感谢。

【问题讨论】:

  • 尝试仅使用 getApplicationContext() 而不是 v.getContext
  • 请显示日志猫结果
  • 嗨。我无法访问 v 变量中的该方法,我如何访问该方法?

标签: java android android-intent android-activity android-studio


【解决方案1】:

经过很长时间我找到了答案,那些人提交的答案帮助我找到了主要问题,这就是解决方案

在 MainActivity 中我添加了一个新参数并将该活动传递给适配器,例如 @Meenal Sharma 和 @ch3tan 提出的

RVAdapter adapter = new RVAdapter(restaurantes, this);

在适配器中

  public Adaptador(List<Restaurant> restaurants, Context context) {
    this.restaurants = restaurants;
    this.context = context;
}

并创建意图:

Intent intent = new Intent(context, RestaurantActivity.class);
context.startActivity(intent);

这部分解决了一个错误,但我遇到的主要错误是,当我使用 Android Studio 创建一个新活动时,该活动创建了继承 ActionBarActivity 的新活动,我将 ActionBarActivity 更改为 AppCompatActivity 并且一切都恢复正常......

【讨论】:

    【解决方案2】:

    将 Activity 对象传递给您的适配器,而不是 Context 对象。 我看到了你的代码。 在这些行替换此代码 MainActivity.java

    Line 68:  RVAdapter adapter = new RVAdapter(restaurantes, MainActivity.this);
    

    RVAdapter.java

    Line 21: Activity mActivityContext; 
    
    Line 55-58: RVAdapter(List<Restaurante> persons, Activity mActivityContext) {
            this.persons = persons;
            this.mActivityContext= mActivityContext;
        }
    

    希望这能解决您的问题。

    【讨论】:

      【解决方案3】:

      传递您设置适配器的活动的上下文

      Context mContext;
      
      //write this line in oncreate
      
         mContext=this; 
         RVAdapter adapter = new RVAdapter(array_restaurants,mContext);
         recList.setAdapter(adapter);
      

      然后在你的适配器类中使用这个上下文代替 v.getContext()

      Context context;
      
      RVAdapter(your array,Context mContext)
        {
          context=mContext;
        }
      

      并像使用它

      personName.setOnClickListener(new View.OnClickListener(){
      
              @Override
              public void onClick(View v) {
      
                  System.out.println("Context");
                  System.out.println(context.toString());
                  Intent intent = new Intent(context, Restaurante.class);
                  context.startActivity(intent);
              }
          });
      

      它可能会要求使用 Acitivity 在 startActivity 中投射上下文,您可以这样做。

      【讨论】:

      • 您好,我实现了您的代码,但出现此错误:无法从静态上下文引用非静态字段“上下文”,因此我将上下文转换为静态,但现在尝试时仍然出现此异常开始活动:unimagdalena.edu.co.restaurantes I/时间线:时间线:Activity_launch_request id:unimagdalena.edu.co.restaurantes 时间:8967504 unimagdalena.edu.co.restaurantes W/dalvikvm:threadid = 1:线程退出未捕获异常(组=0x41852ce0)
      • 你能提供你的整个代码吗..以便帮助我清楚地理解你的问题..
      • 在创建上下文 mContext 之前全局写入此内容;和 mContext=this 里面的 onCreate
      • 你也可以提供你的日志猫堆栈跟踪
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多