Search code examples
kotlinandroid-intentandroid-recyclerviewnullpointerexceptionparcelable

Attempt to invoke interface method 'int java.util.List.size()' on a null object reference on passing Parcelable in Intent Kotlin


So I have a sample app that is currently using Retrofit to fetch data and display it in a recyclerview with its custom adapter. I want to pass the data to the a more details page when I click on a character name on my recyclerView. I found some tutorials and decided to use the Parcelize annotation like this:

@Parcelize data class Character (
val charID: Long,
val name: String,
val birthday: String,
val occupation: List<String>,
val img: String,
val status: String,
val nickname: String,
val appearance: List<Long>,
val portrayed: String,
val category: String,
val betterCallSaulAppearance: List<Long> ) : Parcelable

My adapter looks like this:

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val character = characters[position]
    holder.characterNameText.text = character.name

    holder.characterNameText.setOnClickListener {
        holder.passData(character)
    }
}

override fun getItemCount() = characters.size


class ViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView) {
    val characterNameText = itemView.findViewById<TextView>(R.id.character_name)

    fun passData(character : Character) {
        val intent = Intent(itemView.context, CharacterDetails::class.java)
        intent.putExtra(CHARACTER, character)
        itemView.context.startActivity(intent)
    }



}

And in the CharacterDetails Activity it looks like this:

companion object {
    const val CHARACTER = "character"
}
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_character_details)

    val bundle = intent.extras
    val character = bundle!!.getParcelable<Character>(CHARACTER)


    val characterName = findViewById<TextView>(R.id.character_details_name)

Yet I get a

java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference at com.example.myapplication.models.Character.writeToParcel(Unknown Source:85)

I'm still new to this so I really need your help.Thanks!


Solution

  • Obviously, the error caused by the list reference of the data class is null. You can modify the code like this.

    @Parcelize data class Character (
    val charID: Long,
    val name: String,
    val birthday: String,
    val occupation: List<String>?,
    val img: String,
    val status: String,
    val nickname: String,
    val appearance: List<Long>?,
    val portrayed: String,
    val category: String,
    val betterCallSaulAppearance: List<Long>? ) : Parcelable