【问题标题】:How to pass intent in adapter class如何在适配器类中传递意图
【发布时间】:2019-03-09 13:52:26
【问题描述】:

我正在尝试使用意图从一个活动导航到另一个活动,但是当调用 onclick 方法时我的应用程序崩溃了,给出了空指针异常这是我的适配器类的代码。

@Override
public void onBindViewHolder(absadapter.exViewHolder holder, final int position){
    holder.exname.setText(exList.get(position).name);
    holder.exlogo.setImageResource(exList.get(position).logoId);
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (position == 0) {
                Intent intent=new Intent(context,crunches.class);
                context.startActivity(intent);
            }
        }
    });


}

这里是 logcat 错误:

FATAL EXCEPTION: main
              Process: com.example.ruchit.totalfitness, PID: 1481
              java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
                  at android.content.ComponentName.<init>(ComponentName.java:130)
                  at android.content.Intent.<init>(Intent.java:5787)
                  at com.example.ruchit.totalfitness.absadapter$1.onClick(absadapter.java:60)
                  at android.view.View.performClick(View.java:6312)
                  at android.view.View$PerformClick.run(View.java:24811)
                  at android.os.Handler.handleCallback(Handler.java:790)
                  at android.os.Handler.dispatchMessage(Handler.java:99)
                  at android.os.Looper.loop(Looper.java:171)
                  at android.app.ActivityThread.main(ActivityThread.java:6649)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)

【问题讨论】:

  • 从 logcat 发布错误。
  • 您的context 可能是null
  • Logcat 应该指出哪个对象为空。请张贴出来让我们帮忙。最有可能的context 为空。
  • 你可以使用这个 holder.itemView.context.startActivity(intent)
  • context 可能为空,因此在创建时将您的活动上下文传递给适配器,然后您可以在适配器中使用该上下文

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


【解决方案1】:

改变这个

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

收件人

v.getContext().startActivity(new Intent(v.getContext(), crunches.class));

希望对你有帮助!

【讨论】:

  • 欢迎提供帮助。!快乐编码:)
【解决方案2】:

我看到你已经修复了它,但尝试改变

 Intent intent=new Intent(context,crunches.class);

 Intent intent=new Intent(this,crunches.class);

我很好奇它是否会起作用

【讨论】:

  • 这不起作用我已经在我的适配器类中传递了意图,它将被加载到我的主类中,因此只需传递 (this,crunches.class) 它就无法指向将产生主类和空指针异常,因此最好的方法是使用 getcontext() 来解决这个问题。
【解决方案3】:

开始活动不是持有者或适配器的责任! SOLID 原则 S 说单一对象责任!持有者角色仅用于显示值和处理点击,但不执行点击行为!您应该在使用接口或更简单Butterknife

来初始化回收器和适配器的活动中执行此操作
holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (position == 0) {
                EventBus.getDefault().post(new OnClickEvent())
            }
        }
    });

在活动中

@Subscribe(threadMode = Thread.MAIN)
public void onClickItem(OnClickEvent event) {
      startActivity(new Intent(this,crunches.class));
}

此外,您不需要将上下文传递给适配器

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多