kotlin, как сделать hashMap разборным - PullRequest
1 голос
/ 25 февраля 2020

Имеется переменная hashMap <IntRange, String>, и ее необходимо поместить в пакет как пригодный для сохранения и восстановления в onSaveStateInstance () / onCreateView ():

val map: HashMap<IntRange, String>? = hashMapOf(IntRange(0, 4) to "x", IntRange(5, -1) to "y")

и выполните

//saving:
outState.putParcelable("saved_map", map)

...
//retrieving: 
val map = bundle.getParcelable("saved_map")

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Тем не менее, я бы предложил использовать класс-оболочку, просто потому, что в Kotlin он намного проще, чем в Java. @Parcelize поддерживает HashMap, проблема в том, что он не поддерживает IntRange (или, по крайней мере, его нет в списке). Но, исходя из приведенного примера, кажется, что это должно сработать:

object IntRangeParceler : Parceler<IntRange> {
    override fun create(parcel: Parcel) = IntRange(parcel.readInt(), parcel.readInt())

    override fun IntRange.write(parcel: Parcel, flags: Int) {
        parcel.writeInt(value, start)
        parcel.writeInt(value, endInclusive)
    }
}

@Parcelize
@TypeParceler<IntRange, IntRangeParceler>()
class IntRangeStringMap(val value: HashMap<IntRange, String>)

, и ваши вызовы станут

outState.putParcelable("saved_map", IntRangeStringMap(map))
val map = bundle.getParcelable("saved_map").value

Вы даже можете получить желаемое, добавив функции расширения.

0 голосов
/ 25 февраля 2020

на основе ответа @Alexey Romanov, получил рабочую версию

Я перешел на создание пакета ArrayList<Pair<IntRange, String>>

object IntRangeParceler : Parceler<IntRange> {
    override fun create(parcel: Parcel) = IntRange(parcel.readInt(), parcel.readInt())

    override fun IntRange.write(parcel: Parcel, flags: Int) {
        parcel.writeInt(first)
        parcel.writeInt(last)
    }
}

object PairParceler : Parceler<Pair<IntRange, String>> {
    override fun create(parcel: Parcel): Pair<IntRange, String> =
        Pair(IntRange(parcel.readInt(), parcel.readInt()), parcel.readString())

    override fun Pair<IntRange, String>.write(parcel: Parcel, flags: Int) {
        parcel.writeInt(first.first)
        parcel.writeInt(first.last)
        parcel.writeString(second)
    }
}

@Parcelize
@TypeParceler<IntRange, IntRangeParceler>()
@TypeParceler<Pair<IntRange, String>, PairParceler>()
class IntRangeStringMap(val value:  ArrayList<Pair<IntRange, String>>) : Parcelable
...