【问题标题】:App crashes when using putExtra in startActivity(intent) called from ViewHolder of RecyclerView inside Fragment在从 Fragment 内的 RecyclerView 的 ViewHolder 调用的 startActivity(intent) 中使用 putExtra 时,应用程序崩溃
【发布时间】:2021-05-04 19:04:19
【问题描述】:

我正在努力解决这个问题:活动应该开始,但在使用 putExtra 时却没有。唯一发生的事情是我看到 Fragment 在右侧滑动(出现故障后),然后应用程序崩溃了。请注意,此 Fragment 是 Navigation 组件的一部分。这是我的代码,在 onClick 方法中:

Intent intent = new Intent(v.getContext(), SecondActivity.class);
intent.putExtra("ID", ID);

v.getContext().startActivity(intent);
Log.w("here", "should have started");

其中“v”是我单击的 RecyclerView 的视图。这是点击后不久出现在 Logcat 上的内容:

V/AudioManager: querySoundEffectsEnabled...
W/here: should have started
V/FA: Recording user engagement, ms: 7695
W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@b33fd52
V/FA: Connecting to remote service
V/FA: Activity paused, time: 295957791

当我重新打开应用程序时,它会从 MainActivity(开始)重新启动。如果我评论 putExtra 行,SecondActivity 就会启动,这是一个非常奇怪的行为。任何帮助将不胜感激! :)

【问题讨论】:

  • 你需要发布堆栈跟踪的logcat,这个信息没有用

标签: android android-fragments android-intent android-activity


【解决方案1】:

提供 Activity Context 来启动 Activity。 从 ViewHolder 开始活动不是好的做法,因为它违反了单一职责原则。 实现委托模式来处理 ViewHolder 中的 Click Listener。

interface ItemClickListener {
   void onClick(YourModel item);
}

你的适配器

    class YourAdapter extends RecyclerView.Adapter<YourViewHolder>{
     ItemClickListener listener;
      public YourAdapter(ItemClickListener listener){
      this.listener = listener;
     }
}

监听器的使用

listener.onClick(position); 

您的活动

YourAdapter adapter = YourAdapter(item -> {
   // handle click
})

【讨论】:

  • 这个答案很完美,值得一提的是,您不必只需传回点击项目的位置,您可以传回实际模型item 在被点击的特定位置(因为它在绑定特定视图持有者时可用)意味着它也可以是 onClick(X data) 其中 X 是任何数据类型
  • 感谢您纠正我的错误。我已经更新了我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 2016-08-27
  • 2014-04-18
  • 1970-01-01
相关资源
最近更新 更多