使用导航参数传递数据时,如何解决ArrayList无法转换为Kotlin中的android.os.Parcelable []的问题?

时间:2019-02-15 03:52:57

标签: android kotlin android-navigation android-jetpack android-architecture-navigation

我正在尝试使用这样的导航参数将类别数据(ArrayList)从一个片段发送到另一个片段。

fun setUpArgumentForSearchDestination(categories: ArrayList<Category>) {

    val searchDestination = fragmentView.findNavController().graph.findNode(R.id.destination_search)
        searchDestination?.addArgument(
            "allCategories", NavArgument.Builder()
            .setType(NavType.ParcelableArrayType(Category::class.java))
            .setDefaultValue(categories)
            .build())
        }

在搜索片段中,我从像这样的参数接收数据:

       arguments?.let {
            // I get error in the code below:
            val categories = it.getParcelableArrayList<Category>("allCategories")

        }

我收到错误消息:

  

java.util.ArrayList无法转换为android.os.Parcelable []

即使我不确定导致此问题的原因,我也试图找到答案,似乎我必须像此线程中那样自定义Category类:Read & writing arrays of Parcelable objects

但是我是一个初学者,对那个线程的回答并不太了解。我已经尝试实现parcelable,但仍然无法正常工作。这是我的Category

class Category() : Parcelable {

    var id : Int = 0
    var name : String = ""
    var parentID : Int = 0
    var imageURL : String = ""

    constructor(parcel: Parcel) : this() {
        id = parcel.readInt()
        name = parcel.readString()
        parentID = parcel.readInt()
        imageURL = parcel.readString()
    }


    override fun writeToParcel(parcel: Parcel, flags: Int) {

        parcel.apply {
            writeInt(id)
            writeString(name)
            writeInt(parentID)
            writeString(imageURL)
        }

    }

    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)
        }
    }

}

1 个答案:

答案 0 :(得分:3)

ParcelableArrayType仅支持Parcelable对象的数组,不支持列表。因此,您必须使用ArrayListtoTypedArray()转换为数组:

val searchDestination = fragmentView.findNavController().graph.findNode(R.id.destination_search)
    searchDestination?.addArgument(
        "allCategories", NavArgument.Builder()
        .setType(NavType.ParcelableArrayType(Category::class.java))
        .setDefaultValue(categories.toTypedArray())
        .build())
    }

您将使用https://sourceforge.net/projects/cx-freeze/files/4.3.3/或诸如以下代码获取您的Parcelable数组:

arguments?.let {
    val categories = it.getParcelableArray("allCategories") as Array<Category>
}

导航不支持Parcelables的ArrayList。