質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.01%

kotlinでparcelable

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,382

quu

score 4

ArrayList<Any>にparcelableを実装する方法が分かりません。
作成したリストの中にはString型と独自に作成したクラス(UploadedItem)が入っています。
String型かUploadedItem型から複数のデータをリストに格納して画面遷移したいのですがうまくできません。
下記のコードはParcelable Code Generator(for kotlin)を使って作成しました。

class Images : Parcelable {
    var selectedImages: ArrayList<Any> = ArrayList()

    override fun toString(): String {
        return "Images(selectedImages=$selectedImages)"
    }

    companion object {
        @JvmField val CREATOR: Parcelable.Creator<Images> = object : Parcelable.Creator<Images> {
            override fun createFromParcel(source: Parcel): Images = Images(source)
            override fun newArray(size: Int): Array<Images?> = arrayOfNulls(size)
        }
    }

    constructor(source: Parcel) : this(
         //ここに何を記述すればいいか分かりません
         //No value passed for parameter source(パラメータソースに渡された値はありません)と表示されています。
    )

    override fun describeContents() = 0

    override fun writeToParcel(dest: Parcel, flags: Int) {}
}

class UploadedItem : Parcelable {

    override fun equals(obj: Any?): Boolean {
        return obj is UploadedItem && obj.hashCode() == this.hashCode()
    }

    override fun hashCode(): Int {
        return if (localFile != null) localFile!!.absolutePath.hashCode() else uploadId.toInt()
    }

    val extension: String
        get() {
            if (this.type != null) {
                if (this.type!!.contains("uploadItem")) {
                    if (this.type!!.contains("jpeg")) {
                        return "jpg"
                    } else if (this.type!!.contains("gif")) {
                        return "gif"
                    } else if (this.type!!.contains("png")) {
                        return "png"
                    }
                }
            }
            return "jpg"
        }

    var uploadId: Long = 0
    var thumbUrl: String? = null
    var imageUrl: String? = null
    var originalUrl: String? = null
    var type: String? = null
    var size: Int = 0
    var width: Int = 0
    var height: Int = 0
    var latitude: Double = 0.toDouble()
    var longitude: Double = 0.toDouble()
    var altitude: String? = null
    var comment: String? = null
    var takenTime: String? = null
    var uploadTime: String? = null
    var uploader: User? = null
    var localFile: File? = null

    constructor(localFile: File) {
        this.localFile = localFile
    }

    override fun toString(): String {
        return "UploadedItem{" +
                "uploadId=" + uploadId +
                ", thumbUrl='" + thumbUrl + '\'' +
                ", imageUrl='" + imageUrl + '\'' +
                ", originalUrl='" + originalUrl + '\'' +
                ", type='" + type + '\'' +
                ", size=" + size +
                ", width=" + width +
                ", height=" + height +
                ", latitude=" + latitude +
                ", longitude=" + longitude +
                ", altitude='" + altitude + '\'' +
                ", comment='" + comment + '\'' +
                ", takenTime='" + takenTime + '\'' +
                ", uploadTime='" + uploadTime + '\'' +
                ", uploader=" + uploader +
                ", localFile=" + localFile +
                '}'
    }

    constructor() {}

    override fun describeContents(): Int {
        return 0
    }

    override fun writeToParcel(dest: Parcel, flags: Int) {
        dest.writeLong(this.uploadId)
        dest.writeString(this.thumbUrl)
        dest.writeString(this.imageUrl)
        dest.writeString(this.originalUrl)
        dest.writeString(this.type)
        dest.writeInt(this.size)
        dest.writeInt(this.width)
        dest.writeInt(this.height)
        dest.writeDouble(this.latitude)
        dest.writeDouble(this.longitude)
        dest.writeString(this.altitude)
        dest.writeString(this.comment)
        dest.writeString(this.takenTime)
        dest.writeString(this.uploadTime)
        dest.writeParcelable(this.uploader, flags)
        dest.writeSerializable(this.localFile)
    }

    protected constructor(`in`: Parcel) {
        this.uploadId = `in`.readLong()
        this.thumbUrl = `in`.readString()
        this.imageUrl = `in`.readString()
        this.originalUrl = `in`.readString()
        this.type = `in`.readString()
        this.size = `in`.readInt()
        this.width = `in`.readInt()
        this.height = `in`.readInt()
        this.latitude = `in`.readDouble()
        this.longitude = `in`.readDouble()
        this.altitude = `in`.readString()
        this.comment = `in`.readString()
        this.takenTime = `in`.readString()
        this.uploadTime = `in`.readString()
        this.uploader = `in`.readParcelable<User>(User::class.java.getClassLoader())
        this.localFile = `in`.readSerializable() as? File
    }

    companion object {

        val TAG = "Upload"

        @JvmField
        val CREATOR: Parcelable.Creator<UploadedItem> = object : Parcelable.Creator<UploadedItem> {
            override fun createFromParcel(source: Parcel): UploadedItem {
                return UploadedItem(source)
            }

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

constructorに何を記述すべきなのか教えてください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

constructorに読み込み処理、writeToParcel()に書き込み処理を書くのでは?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/20 11:00

    回答ありがとうございます。
    もしよろしければもう少し具体的に教えていただけないでしょうか。

    キャンセル

  • 2017/06/20 11:16

    ちょっとググっただけなので。
    http://qiita.com/kazhida/items/a085d5c662ce03bd5696

    キャンセル

0

class Images : Parcelable {
    var selectedImages: ArrayList<out Parcelable> = ArrayList()

    override fun toString(): String {
        return "Images(selectedImages=$selectedImages)"
    }

    companion object {
        @JvmField val CREATOR: Parcelable.Creator<Images> = object : Parcelable.Creator<Images> {
            override fun createFromParcel(source: Parcel): Images = Images(source)
            override fun newArray(size: Int): Array<Images?> = arrayOfNulls(size)
        }
    }

    constructor(source: Parcel) {
        selectedImages = source.createTypedArrayList(CREATOR)
    }

    override fun describeContents() = 0

    override fun writeToParcel(dest: Parcel, flags: Int) {
        dest.writeTypedList(selectedImages)
    }
}


writeToParcelで書き込んで
コンストラクタで読み込むのが基本で
Parcelableを含んだクラスの配列でないと書き込み及び読み込みができないはずです

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/22 09:15

    回答ありがとうございます。
    Any型はParcelableにできないと聞いたことがあるのですがどうなのでしょうか?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る