在从 Fragment 内的 RecyclerView 的 ViewHolder 调用的 startActivity(intent) 中使用 putExtra 时,应用程序崩溃

Posted

技术标签:

【中文标题】在从 Fragment 内的 RecyclerView 的 ViewHolder 调用的 startActivity(intent) 中使用 putExtra 时,应用程序崩溃【英文标题】:App crashes when using putExtra in startActivity(intent) called from ViewHolder of RecyclerView inside Fragment 【发布时间】: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,这个信息没有用 【参考方案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 是任何数据类型 感谢您纠正我的错误。我已经更新了我的答案

以上是关于在从 Fragment 内的 RecyclerView 的 ViewHolder 调用的 startActivity(intent) 中使用 putExtra 时,应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

单击不在 Fragment 内的 RecyclerView 项目上工作

ViewPager 内的 Fragment 中的 EditText 焦点上的视图混淆了

使用 Fragment 内的方法更改 TextView 值 (NullPointerException)

将Sqlite数据放入两个不同Fragment内的两个ListView

更新 viewpager 内的 Fragment 视图而不重新加载数据

从 Fragment 内的 AsyncTask 重新启动 Loader (SQLite) 时出现 IllegalStateException