You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中按DataClass的writeTime排序问题及实现方案

RecyclerView Adapter中DiaryCard列表按日期从新到旧排序解决方案

问题根源

你用sortedBy得到空列表,大概率是两个原因:要么没有正确处理writeTime字符串到LocalDate的解析异常,导致排序逻辑抛出异常后返回空;要么是调用排序时原始items列表还未被正确初始化填充。另外,sortedBy默认是升序,要实现从新到旧的顺序需要用降序排序方法。

完整代码实现

前提说明

假设你的DiaryCard数据类中writeTime字段是LocalDate.now().toString()生成的,格式为yyyy-MM-dd(LocalDate默认的字符串格式):

data class DiaryCard(val writeTime: String, // 其他业务字段...)

Adapter排序逻辑实现

推荐在Adapter内部维护原始数据源,对外暴露排序后的只读列表,避免重复排序:

class DiaryAdapter : RecyclerView.Adapter<DiaryAdapter.DiaryViewHolder>() {
    // 私有原始数据源,仅内部修改
    private val rawItems = mutableListOf<DiaryCard>()
    
    // 自动返回按日期从新到旧排序后的列表
    private val sortedItems: List<DiaryCard>
        get() = rawItems.sortedByDescending { card ->
            // 安全解析日期,避免格式错误导致排序失败
            runCatching { LocalDate.parse(card.writeTime) }.getOrNull() ?: LocalDate.MIN
        }

    // 更新数据源的方法,外部调用此方法传入新数据
    fun updateItems(newItems: List<DiaryCard>) {
        rawItems.clear()
        rawItems.addAll(newItems)
        notifyDataSetChanged()
    }

    override fun getItemCount(): Int = sortedItems.size

    override fun onBindViewHolder(holder: DiaryViewHolder, position: Int) {
        val currentCard = sortedItems[position]
        // 绑定数据到视图,示例:
        holder.dateTv.text = currentCard.writeTime
        // 其他视图绑定逻辑...
    }

    class DiaryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val dateTv: TextView = itemView.findViewById(R.id.tv_diary_date)
        // 其他控件初始化...
    }
}

关键细节解析

  1. 安全日期解析:用runCatching包裹LocalDate.parse,如果writeTime格式错误(比如非yyyy-MM-dd),会返回LocalDate.MIN(最早的日期),确保这类数据排在列表末尾,不会导致整个排序逻辑失效返回空列表。
  2. 降序排序:直接使用sortedByDescending实现从新到旧的顺序,比sortedBy后调用reversed()更高效。
  3. 数据源隔离:用私有rawItems存储原始数据,排序后的sortedItems作为只读列表供绑定使用,避免原始数据被意外修改。

异常情况处理

如果排序后依然为空,排查以下几点:

  • 调用updateItems后,打印rawItems.size确认原始数据是否已正确填充。
  • 若writeTime是自定义格式(比如yyyy/MM/dd),需要指定对应解析器:
    val dateFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd")
    LocalDate.parse(card.writeTime, dateFormatter)
    
  • 检查是否在排序前对rawItems执行了清空操作。

内容的提问来源于stack exchange,提问作者Hyejung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 17:50:43