Отправка массива String и получение его с помощью parcelable kotlin - PullRequest
0 голосов
/ 25 сентября 2019

Я пытался отправить массив строк с использованием parcel в kotlin, я пробовал несколько вещей, таких как преобразование в массив перед использованием writeTypedArray или непосредственное использование writeStringArray.Я также пытался читать, используя createTypedArray и createStringArray.

В большинстве случаев содержимое, которое я получаю, является правильным (я имею в виду, что внутренняя часть массива не изменяется), но есть некоторый случай, когда он становитсяNULL и некоторые ссылки в массиве.

Я проверил свой код и распечатал его до и после использования намерения, и именно в этом заключается разница, поэтому я думаю, что ошибка заключается в посылке

Это место, где я ставлю свои намерения, когда я вызываю showGenres (), его шоу точно соответствует жанрам, таким как Comedy и Slice of Life

val anime : Anime = news.anime
        val intent : Intent = Intent(holder.btnViewMore.context, DetailActivity::class.java)
        news.anime.showGenres()
        intent.putExtra("choosen", anime)
        holder.btnViewMore.context.startActivity(intent)

, но после того, как яполучить намерение, когда я вызываю showGenres, содержимое становится пустым (большинство из них), и некоторая строка типа "P�� https://s4.anilist.co/file/anilistcdn/media/anime/banner/104199-ha1rxhhOb8Yp.jpg��������Comedy������Slice".

anime = intent.getParcelableExtra("choosen")
    anime.showGenres()

введите описание изображения здесь

Ниже приведены мои классы, которые используют parcellable

package com.example.jnimekuy.Model

import android.os.Parcel
import android.os.Parcelable
import android.util.Log

class Anime(
    var id: Int = 0,
    var title: String? = "",
    var image: String? = "",
    var description: String? = "",
    var status: String? = "",
    var startDate: String? = "",
    var endDate: String? = "",
    var season: String? = "",
    var episode: Int? = 1,
    var duration: Int? = 1,
    var trailer: String? = "",
    var cover: String? = "",
    var banner: String? = "",
    var genreList: List<String>? = ArrayList(),
    var avgScore: Float? = 1F
):Parcelable{
    constructor(parcel: Parcel) : this(
        parcel.readInt(),
        parcel.readString(),
        parcel.readString(),
        parcel.readString()?.replace("<br>","",true),
        parcel.readString(),
        parcel.readString(),
        parcel.readString(),
        parcel.readString(),
        parcel.readInt(),
        parcel.readInt(),
        parcel.readString(),
        parcel.readString(),
        parcel.readString(),
        parcel.createStringArrayList()?.filterNotNull(),
        parcel.readFloat()
    )

override fun writeToParcel(parcel: Parcel, p1: Int) {
    parcel.writeInt(id)
    parcel.writeString(title)
    parcel.writeString(image)
    parcel.writeString(description)
    parcel.writeString(status)
    parcel.writeString(startDate)
    parcel.writeString(endDate)
    parcel.writeString(season)
    episode?.let { parcel.writeInt(it) }
    duration?.let { parcel.writeInt(it) }
    parcel.writeString(trailer)
    parcel.writeString(cover)
    parcel.writeString(banner)
    parcel.writeStringList(genreList)
    avgScore?.let { parcel.writeFloat(it) }
}

fun showGenres(){
    for(i in this!!.genreList!!)
    {
        Log.d("genre",i)
    }
}

override fun describeContents(): Int {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}

companion object CREATOR : Parcelable.Creator<Anime> {
    override fun createFromParcel(parcel: Parcel): Anime {
        return Anime(parcel)
    }

    override fun newArray(size: Int): Array<Anime?> {
        return arrayOfNulls(size)
    }
}

}

1 Ответ

0 голосов
/ 25 сентября 2019

Хорошо, я нашел проблему, потому что я использую let, который, если не ноль, то отправляет что-то, затем, если его ноль, он ничего не отправляет, но все равно открывается конструктором участка.Нет ничего плохого в массиве строк записи и типа.что я сделал, чтобы положить, если ноль, то все еще отправить что-то

    parcel.writeInt(id)
    parcel.writeString(title)
    parcel.writeString(image)
    parcel.writeString(description)
    parcel.writeString(status)
    parcel.writeString(startDate)
    parcel.writeString(endDate)
    parcel.writeString(season)
    if(episode != null){ parcel.writeInt(episode!!) }
    else { parcel.writeInt(0) }
    if(duration != null){ parcel.writeInt(duration!!) }
    else { parcel.writeInt(0) }
    parcel.writeString(trailer)
    parcel.writeString(cover)
    parcel.writeString(banner)
    parcel.writeStringList(genreList)
    avgScore?.let { parcel.writeFloat(it)
...