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

点击CalendarView日期后查询并展示对应Entry数据的问题求助

解决CalendarView选日期后查询展示Entry数据的问题

问题1:修正DataRepository的getEntryFromDate方法

直接替换为传入的参数,避免错误使用成员变量:

// 修正后的方法
fun getEntryFromDate(date: Long): List<Entry> {
    return db.entryDao().getEntriesByDate(date)
}

问题2:在CalendarScreen中获取ViewModel的entries数据渲染EntryCard

Jetpack Compose场景

通过collectAsState观察ViewModel的数据流,自动刷新UI:

@Composable
fun CalendarScreen(viewModel: EntryViewModel = viewModel()) {
    val entries by viewModel.entries.collectAsState(initial = emptyList())

    // 日历选择逻辑...

    // 渲染EntryCard列表
    LazyColumn {
        items(entries) { entry ->
            EntryCard(entry = entry)
        }
    }
}

传统View体系场景

用observe监听LiveData,更新RecyclerView数据:

// Activity/Fragment中
viewModel.entries.observe(this) { entries ->
    entryAdapter.submitList(entries)
}

问题3:解决EntryViewModel初始化时loadEntryList()无参数报错

初始化时传入默认日期(比如今天的无时间戳):

class EntryViewModel(private val repository: DataRepository) : ViewModel() {
    private val _entries = MutableStateFlow<List<Entry>>(emptyList())
    val entries = _entries.asStateFlow()

    init {
        // 初始化加载今日数据
        loadEntryList(getTodayWithoutTime())
    }

    fun loadEntryList(date: Long) {
        viewModelScope.launch {
            _entries.value = repository.getEntryFromDate(date)
        }
    }

    // 生成今日无时间戳的辅助方法
    private fun getTodayWithoutTime(): Long {
        val calendar = Calendar.getInstance().apply {
            set(Calendar.HOUR_OF_DAY, 0)
            set(Calendar.MINUTE, 0)
            set(Calendar.SECOND, 0)
            set(Calendar.MILLISECOND, 0)
        }
        return calendar.timeInMillis
    }
}

完整流程串联

  1. 在CalendarView的日期选择回调中,将选中日期转换为无时间的Long值
  2. 调用ViewModel的loadEntryList(selectedDate)触发查询
  3. ViewModel通过Repository获取数据后更新数据流
  4. CalendarScreen监听数据流变化,自动渲染EntryCard列表

示例日期选择回调代码:

// Compose中CalendarView回调示例
CalendarView(
    onDateSelected = { selectedDate ->
        val cleanDate = convertToDateWithoutTime(selectedDate)
        viewModel.loadEntryList(cleanDate)
    }
)

// 日期转换辅助方法
private fun convertToDateWithoutTime(date: Long): Long {
    val calendar = Calendar.getInstance().apply {
        timeInMillis = date
        set(Calendar.HOUR_OF_DAY, 0)
        set(Calendar.MINUTE, 0)
        set(Calendar.SECOND, 0)
        set(Calendar.MILLISECOND, 0)
    }
    return calendar.timeInMillis
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 19:27:33