Как решить ошибку ArrayList не может быть приведен к android.os.Parcelable[] в Kotlin при передаче данных с помощью аргумента навигации?
Я пытаюсь отправить данные категорий (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
класс как в этой теме: чтение и запись массивов объектов Parcelable
но я новичок, и не совсем понимаю с этим ответом из этой темы. Я пытался реализовать 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 ответ
ParcelableArrayType
поддерживает только массивы Parcelable
объекты, а не списки. Поэтому вы должны конвертировать ваши ArrayList
в массив с помощью toTypedArray()
:
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())
}
Вы получите свой массив Parcelables, используя Safe Args или код, такой как:
arguments?.let {
val categories = it.getParcelableArray("allCategories") as Array<Category>
}
Навигация не поддерживает ArrayLists of Parcelables.