单位类型的枚举
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()
开头。如果用户在您的应用程序打开时更改了语言,这也会导致它更新为最新翻译。
我想创建一个 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()
开头。如果用户在您的应用程序打开时更改了语言,这也会导致它更新为最新翻译。