0

I am creating a framgent using Parcelable.

In most cases there is nothing wrong,

but in the firebase Crashlytics report I get an Unmarshalling unknown type code Exception.

I am not sure why I am getting that error.

Below is my code.

dataClass

class MovieNew(
        val Url: String,                               
        val movieDetail : ArrayList<MovieDetail>,
        val imageSrc : String,
        val brandImageSrc : String,
) : Parcelable {
    constructor(parcel: Parcel) : this(
            parcel.readString(),
            arrayListOf<MovieDetail>().apply {
                parcel.readList(this, MovieDetail::class.java.classLoader)
            },
            parcel.readString(),
            parcel.readString()) {
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(Url)
        parcel.writeList(movieDetail)
        parcel.writeString(imageSrc)
        parcel.writeString(brandImageSrc)
    }

    override fun describeContents(): Int {
        return 0
    }

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

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

Adapter

class ContentsNewListFragmentAdapter(fm: androidx.fragment.app.FragmentManager, var movieList: ArrayList<MovieNew>, var brandList : ArrayList<BrandList>) : androidx.fragment.app.FragmentStatePagerAdapter(fm) {
    private var listener: MainActivityListener? = null

    override fun getItem(position: Int): androidx.fragment.app.Fragment {
        val tabPosition : Int = Utils.setBrandNum(brandList ,movieList[position].brandId.toInt())
        val fragment = ContentsNewListFragment.newInstance(movieList[position],tabPosition)
        fragment.setMainListener(listener)
        return fragment
    }

fragment

class ContentsNewListFragment : androidx.fragment.app.Fragment() {
    private var model: MovieNew? = null
    private var tabPostion : Int? = null
    private var listener: MainActivityListener? = null
    companion object {
        fun newInstance(model : MovieNew, tabPostion : Int): ContentsNewListFragment {
            val args = Bundle()
            val fragment = ContentsNewListFragment()
            if (model != null){
                args.putParcelable("model", model)
                args.putInt("tabPosition", tabPostion)
                fragment.arguments = args
            }
            return fragment
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (arguments != null) {
            model = arguments?.getParcelable("model")
            tabPostion = arguments?.getInt("tabPosition")
        }

    }

Let me know if you know the solution.

1 Answers1

0

How about MovieDetail class, did you implement Parcelable over there too? All fields must be parcelable.

Also I don't know if you know, you don't have to do "parceling" manually, there is @Parcelize annotation, just annotate the class you want to be parcelable and implement Parcelable interface, but you don't have to write any implementation manually. Condition is that primary constructor parameters are all parcelable too.

ivan
  • 55
  • 1
  • 8