Skip to content

Instantly share code, notes, and snippets.

@saschpe
Last active May 24, 2022 21:50
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save saschpe/a27d4be98a96867307756796740a1061 to your computer and use it in GitHub Desktop.
Save saschpe/a27d4be98a96867307756796740a1061 to your computer and use it in GitHub Desktop.
Kotlin enum class extension for Android (SharedPreference, Parcelable, Bundle, Intent)
import android.content.SharedPreferences
import android.os.Bundle
import android.os.Parcel
inline fun <reified T : Enum<T>> Bundle.getEnum(key: String, default: T) =
getInt(key).let { if (it >= 0) enumValues<T>()[it] else default }
fun <T : Enum<T>> Bundle.putEnum(key: String, value: T?) =
putInt(key, value?.ordinal ?: -1)
inline fun <reified T : Enum<T>> SharedPreferences.getEnum(key: String, default: T) =
this.getInt(key, -1).let { if (it >= 0) enumValues<T>()[it] else default }
fun <T : Enum<T>> SharedPreferences.Editor.putEnum(key: String, value: T?) : SharedPreferences.Editor =
this.putInt(key, value?.ordinal ?: -1)
inline fun <reified T : Enum<T>> Parcel.readEnum() =
readInt().let { if (it >= 0) enumValues<T>()[it] else null }
fun <T : Enum<T>> Parcel.writeEnum(value: T?) =
writeInt(value?.ordinal ?: -1)
inline fun <reified T1 : Enum<T1>, T2 : Number> fromNumber(value: T2) : T1? =
enumValues<T1>().firstOrNull { it.ordinal == value }
inline fun <reified T1 : Enum<T1>> fromInt(value: Int) : T1? = fromNumber<T1, Int>(value)
inline fun <reified T1 : Enum<T1>> fromLong(value: Long) : T1? = fromNumber<T1, Long>(value)
@saschpe
Copy link
Author

saschpe commented Dec 3, 2017

To use Kotlin enum classes within recycler adapters:

    private enum class ItemViewType {
        A,
        B
    }

    override fun getItemViewType(position: Int): Int {
        return when {
            isAOnPosition(position) -> ItemViewType.A.ordinal
            isBOnPosition(position) -> ItemViewType.B.ordinal
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, itemViewType: Int): RecyclerView.ViewHolder {
        return when (fromInt<ItemViewType>(itemViewType)) {
            ItemViewType.A -> ARecyclerViewHolder(inflater.inflate(R.layout.view_a_item, parent, false))
            ItemViewType.B -> BRecyclerViewHolder(inflater.inflate(R.layout.view_b_item, parent, false))
        }
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment