You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Intent从RecyclerAdapter向Activity传参时App崩溃,需传递restaurant id

崩溃排查与解决步骤

第一步:优先获取崩溃堆栈信息

先查看Logcat输出的完整崩溃堆栈,确认崩溃是发生在点击跳转前的Adapter逻辑里,还是跳转后RestaurantMenuActivity的接收参数逻辑里,快速缩小问题范围。

第二步:排查跳转前的常见崩溃点

  • 检查holder.txtRestaurantName.tag空指针问题:这是该场景最高发的崩溃原因,你直接调用toString(),如果tag未提前赋值、赋值为null,就会触发空指针异常。
    修复代码示例:
    holder.llContent.setOnClickListener {
        // 先对tag判空,为空就直接截断点击逻辑避免崩溃
        val restaurantId = holder.txtRestaurantName.tag?.toString() ?: return@setOnClickListener
        val restaurantName = holder.txtRestaurantName.text?.toString() ?: ""
        println(restaurantId)
        val intent = Intent(context, RestaurantMenuActivity::class.java).apply {
            putExtra("restaurantId", restaurantId)
            putExtra("restaurantName", restaurantName)
        }
        context.startActivity(intent)
    }
    
  • 检查启动Activity的Context类型:如果你的Adapter传入的Context是Application上下文,直接启动Activity需要添加FLAG_ACTIVITY_NEW_TASK旗标,否则会抛出异常。推荐直接用RecyclerView宿主Activity的Context来启动页面,不需要额外加旗标。
  • 检查RestaurantMenuActivity是否已在AndroidManifest.xml中注册,未注册的Activity启动时会直接抛出ActivityNotFoundException。

第三步:排查跳转后接收参数的常见崩溃点

  • 确认RestaurantMenuActivity中取参数的key和传入的key完全一致,大小写也需要匹配,比如不要把restaurantId误写为RestaurantId。
  • 如果你在接收端需要把restaurantId转为Int/Long类型使用,一定要加异常捕获,避免id内容不是纯数字导致类型转换崩溃:
    // 接收端示例代码
    val restaurantIdStr = intent.getStringExtra("restaurantId") ?: ""
    val restaurantId = try {
        restaurantIdStr.toLong()
    } catch (e: NumberFormatException) {
        // 异常处理逻辑,比如返回上一页、给默认id
        -1L
    }
    
优化建议
  • 不要用View的tag存储业务参数,推荐直接从Adapter对应的数据源实体类里取对应position的restaurantId,比从View的tag取值更稳定,也避免tag被其他逻辑覆盖导致数据错误。
  • 项目如果支持Parcelable序列化,可以直接把整个餐厅实体类序列化后通过Intent传递,减少多参数传递时key写错的概率。

内容的提问来源于stack exchange,提问作者prateek jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:06:04