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
相关产品推荐
相关产品推荐

