Передача массива Parcelable с использованием Intent.putExtra

Я создал класс Parcelable под названием «Song» и пытаюсь передать массив из них между действиями с помощью Intent.putExtra () в настоящий момент, когда я получаю активность и использую this.intent.getParcelableArrayExtra. Я получаю массив аргументов, и я не могу найти способ преобразовать его в массив песен.

начало кода:

val i = Intent(this, CompletedSongsActivity::class.java) val completedSongs = songList.filter{ it.solved }.toTypedArray() i.putExtra("COMPLETED_SONGS", completedSongs) startActivity(i) 

код в действии:

 val songs = this.intent.getParcelableArrayExtra("COMPLETED_SONGS") as Array<Song> 

Затем я получаю сообщение об ошибке:

 java.lang.ClassCastException: android.os.Parcelable[] cannot be cast to com.example.kyle.songle.Song[] 

РЕДАКТИРОВАТЬ:

мой класс песни:

 class Song(val name: String,val artist: String,val youtubeURL: String,val number: Int, var solved: Boolean): Parcelable { companion object { @JvmField @Suppress("unused") val CREATOR = object: Parcelable.Creator<Song> { override fun newArray(size: Int): Array<Song?> { return arrayOfNulls<Song>(size) } override fun createFromParcel(source: Parcel?): Song { return Song(source!!) } }} private constructor(parcelIn: Parcel) : this(parcelIn.readString(),parcelIn.readString(),parcelIn.readString(),0,true) override fun writeToParcel(dest: Parcel?, flags: Int) { dest?.writeString(name) dest?.writeString(artist) dest?.writeString(youtubeURL) } override fun describeContents(): Int { return 0 } 

Невозможно напрямую преобразовать массив, как вы пытаетесь сделать. Возвращаемое значение getParcelableArrayExtra("COMPLETED_SONGS") в отношении ОС Android зависит от массива Parcelable который просто содержит только экземпляры Song .

Чтобы использовать его напрямую, вы можете использовать функцию Array.filterIsInstance для создания List<Song> который гарантированно будет безопасным по типу. Если это абсолютно необходимо для массива, то .toTypedArray() преобразует его обратно в Array<Song>

Это должно привести к следующему коду: val songs = getParcelableArrayExtra("COMPLETED_SONGS").filterIsInstance<Song>().toTypedArray()

  • Не удалось получить неизвестное свойство «anko_version» для объекта типа ...?
  • Android RxJava onNext вызывается, даже если наблюдатель не подписан
  • Создавайте ошибки с новыми параметрами kotlin 1.1, kapt cant parse databinding params
  • Kotlin Closable и SQLiteDatabase на Android
  • Android - Tab # 3 очищает представление списка из Tab # 1.
  • Ошибка приложения при попытке отправить SMS-сообщение
  • Retrofit2 и kotlin
  • RxJava не может быть завершен, как избежать toBlocking ()
  • Android Studio 3.0 поддерживает Kotlin: активность как контекст
  • Как вы объявляете полиморфное поле, которое использует JsonTypeInfo.As.WRAPPER_OBJECT с Jackson XML?
  • Как протестировать цепочку rxjava?
  • Давайте будем гением компьютера.