Как решить ошибку ArrayList не может быть приведен к android.os.Parcelable [] в Kotlin при передаче данных с помощью аргумента навигации? - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь отправить данные категорий (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 Ответ

0 голосов
/ 15 февраля 2019

A 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...