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

RecyclerView传递Firestore数据到Activity时出现空指针异常

问题:Firestore数据通过Intent传递到Activity时出现空指针异常

从Firestore获取数据填充RecyclerView后,点击条目尝试传递数据到另一个Activity时触发空指针异常,怀疑是intent.getParcelableExtra()!!的用法问题,替换写法后依然报错。

错误信息

Caused by: java.lang.NullPointerException
at com.zwdalpha.skedaddle.Activities.Services.CategoryServiceActivity.onCreate(CategoryServiceActivity.kt:32)

相关代码

PopularCategoriesAdapter.kt

class PopularCategoriesAdapter(val category: ArrayList<Category>) :
    RecyclerView.Adapter<PopularCategoriesAdapter.ViewHolder>() {

    var selectedCategory = Category("", "")

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bindCategory(category[position])

        holder.itemView.setOnClickListener { v ->
            selectedCategory.category = category[position].category
            val intent = Intent(holder.itemView.context, CategoryServiceActivity::class.java)
            intent.putExtra("category", category[position].category)
            holder.itemView.context.startActivity(intent)
        }
    }
}

CategoryServiceActivity.kt

class CategoryServiceActivity : AppCompatActivity() {

    lateinit var category: Category

    @SuppressLint("NotifyDataSetChanged")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_category_service)

// Line 32 - category = intent.getParcelableExtra("category")!!
    }
}

解决方案

问题根源

你在Adapter中传递的是category[position].category(字符串类型),但在Activity里试图用getParcelableExtra()接收Category类型的Parcelable对象,类型完全不匹配,导致返回null,再用!!强制非空就触发了空指针异常。

两种修复方案

方案1:传递完整的Category对象(推荐)

需要先让你的Category类实现Parcelable接口,这样才能通过Intent传递对象:

data class Category(val id: String, val category: String) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString()!!,
        parcel.readString()!!
    )

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(id)
        parcel.writeString(category)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<Category> {
        override fun createFromParcel(parcel: Parcel): Category {
            return Category(parcel)
        }

        override fun newArray(size: Int): Array<Category?> {
            return arrayOfNulls(size)
        }
    }
}

然后修改Adapter中的Intent传参代码,传递完整的Category对象:

intent.putExtra("category", category[position])

最后在Activity中安全接收:

category = intent.getParcelableExtra("category") ?: throw IllegalArgumentException("Category数据未传递")
// 或者更友好的异常处理
// category = intent.getParcelableExtra("category") ?: run {
//     Toast.makeText(this, "数据加载失败", Toast.LENGTH_SHORT).show()
//     finish()
//     return
// }

方案2:仅传递字符串并适配接收逻辑

如果只需要传递分类名称,保持Adapter的传参代码不变,修改Activity的接收逻辑:

val categoryName = intent.getStringExtra("category") ?: ""
// 构造Category对象或者根据名称做后续处理
category = Category("", categoryName)

内容的提问来源于stack exchange,提问作者Zachary Smouse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 12:45:36