我想創建一個 Enum 或 Sealed 類來保存 DropDownMenu 的值,以便對串列進行排序。
在我的 ViewModel 我有
result.data.map { it.toPresentationModel() }.sortedWith(compareBy {it.date})
而不是compareBy {it.date})我想在列舉/密封類中這樣做,因為對于我想做的其他選項(compareByDescending{it.date}),只需在此處傳遞 DropDownMenu 的當前選定值。
在 compareBy() 里面,我需要從 Data 類中傳遞一個引數
而且我還想檢索列舉的值名稱以將其放入我的 DropDownMenu
這是它的樣子

這可能嗎?請問有什么建議嗎?
uj5u.com熱心網友回復:
您的列舉類本身可以實作 Comparator 介面,因此您可以直接將其實體傳遞給compareBy其他類似函式。
我認為您不應該對值的名稱進行硬編碼,因為這會使翻譯變得困難。將這些名稱放在字串資源中。一旦有可用的背景關系,您就可以對名稱執行一次性初始化。您可以覆寫toString()以顯示此可能翻譯的名稱,以便在下拉串列中輕松使用此列舉。
例如,給定這個類:
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()應盡早呼叫,例如在onCreate()MainActivity 開始時。如果用戶在您的應用打開時更改了語言,這也將導致它更新為最新的翻譯。
uj5u.com熱心網友回復:
您可以在列舉內部實作函式:
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>
}
注意最后一個常數后面的分號。
然后,您可以將其實作為配接器或其他東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/441079.html
標籤:安卓 排序 科特林 枚举 android-jetpack-compose
上一篇:如何對串列元素進行排序?
