单位类型的枚举

Enum of type Unit

我想创建一个 Enum 或 Sealed class 来保存 DropDownMenu 的值以便对列表进行排序。

在我的 ViewModel 中我有

result.data.map { it.toPresentationModel() }.sortedWith(compareBy {it.date})

而不是 compareBy {it.date}) 我想在 enum/sealed class 中这样做,因为对于其他选项我想做 (compareByDescending{it.date}) 并且只是将当前选择的值传递到这里DropDownMenu.

在 compareBy() 内部,我需要从数据中传递一个参数 class

而且我还想检索枚举的值名称以将其放入我的 DropDownMenu

这是它的样子

这可能吗?有什么建议吗?

您可以在枚举中实现函数:

enum class SortBy(val name: String) {
    DATE("Date") {
        override fun <T : Comparable> sort(data: List<T>): List<T> { ... }
    },
    TIME("Time") {
        override fun <T : Comparable> sort(data: List<T>): List<T> { ... }
    },
    AMOUNT("Amount") {
        override fun <T : Comparable> sort(data: List<T>): List<T> { ... }
    },
    PRICE("Price") {
        override fun <T : Comparable> sort(data: List<T>): List<T> { ... }
    };

    abstract fun <T : Comparable> sort(data: List<T>): List<T>
}

注意最后一个常量后面的分号。

然后您可以将其实现为适配器或其他东西。

您的枚举 class 本身可以实现 Comparator 接口,因此您可以直接将其实例传递给 compareBy 和其他类似函数。

我认为您不应该 hard-code 值的名称,因为这会使翻译变得困难。将这些名称放入 String 资源中。一旦有可用的上下文,您就可以对名称执行 one-time 初始化。您可以重写 toString() 以显示此可能翻译的名称,以便在 drop-downs.

中轻松使用此枚举

例如,给定这个 class:

data class PresentationModel(val date: LocalDate, val price: BigInteger)

您可以创建此枚举:

enum class PresentationSort(
    private val nameId: Int,
    compareBy: (PresentationModel)->Comparable<*>,
    isDescending: Boolean = false
): Comparator<PresentationModel> {
    Date(R.string.date, PresentationModel::date),
    DateDescending(R.string.date, PresentationModel::date, true),
    Price(R.string.price, PresentationModel::price);

    private var resourceName: String? = null
    private val comparator = if(isDescending) compareByDescending(compareBy) else compareBy(compareBy)
    override fun compare(o1: PresentationModel?, o2: PresentationModel?): Int 
        = comparator.compare(o1, o2)

    override fun toString() = resourceName ?: name

    companion object {
        fun initialize(context: Context) {
            for (value in values()) resourceName = context.getString(value.nameId)
        }
    }
 
}

并像这样传递它:

result.data.map { it.toPresentationModel() }.sortedWith(PresentationSort.Date)

PresentationSort.initialize() 应尽早调用,例如在 MainActivity 的 onCreate() 开头。如果用户在您的应用程序打开时更改了语言,这也会导致它更新为最新翻译。