使用导航参数传递数据时,如何解决错误 ArrayList cannot be cast to android.os.Parcelable[] in Kotlin?
how to solve error ArrayList cannot be cast to android.os.Parcelable[] in Kotlin when passing data using navigation argument?
我正在尝试使用这样的导航参数将类别数据 (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 cannot be cast to android.os.Parcelable[]
我试图找到答案,尽管我不确定这个问题的原因,但似乎我必须自定义我的 Category
class 就像在这个线程中一样:Read & writing arrays of Parcelable objects
但我是初学者,并不太理解该线程的答案。我已经尝试实现 parcelable
,但它仍然不起作用。这是我的 Category
class
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)
}
}
}
A ParcelableArrayType
仅支持 数组 的 Parcelable
对象,不支持列表。因此,您必须使用 toTypedArray()
:
将 ArrayList
转换为数组
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())
}
您将使用 Safe Args 或以下代码检索您的 Parceables 数组:
arguments?.let {
val categories = it.getParcelableArray("allCategories") as Array<Category>
}
导航不支持 Parceables 的数组列表。
我正在尝试使用这样的导航参数将类别数据 (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 cannot be cast to android.os.Parcelable[]
我试图找到答案,尽管我不确定这个问题的原因,但似乎我必须自定义我的 Category
class 就像在这个线程中一样:Read & writing arrays of Parcelable objects
但我是初学者,并不太理解该线程的答案。我已经尝试实现 parcelable
,但它仍然不起作用。这是我的 Category
class
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)
}
}
}
A ParcelableArrayType
仅支持 数组 的 Parcelable
对象,不支持列表。因此,您必须使用 toTypedArray()
:
ArrayList
转换为数组
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())
}
您将使用 Safe Args 或以下代码检索您的 Parceables 数组:
arguments?.let {
val categories = it.getParcelableArray("allCategories") as Array<Category>
}
导航不支持 Parceables 的数组列表。