【问题标题】:ViewModel, LiveData and Transformations.mapViewModel、LiveData 和 Transformations.map
【发布时间】:2018-10-15 20:28:45
【问题描述】:

刚接触 Kotlin 和 Android 开发及相关,我不确定如何应用一些业务逻辑和转换值。我有一个类的列表,我想修改类中的一个值,同时不伤害类中的其他所有内容。一旦我进入视图模型,我不确定如何访问我的类中的时间值来修改它。如果有人能指出我正确的方向,我将不胜感激。

实体与道

import org.threeten.bp.Instant

data class ActionDetails(val time: Instant,
                     val firstName: String,
                     ... )

@Query("SELECT time, first_name as firstName...")
fun liveStatus(): LiveData<List<ActionDetails>>

视图模型

class MainViewModel(private val repository: DataRepository) : ViewModel() {

    private val _actions: LiveData<List<ActionDetails>>
    val actions: LiveData<List<ActionDetails>>
        get() = _actions

    init {
        _actions = Transformations.map(repository.liveStatus()) {
            //Convert Instant value per business rules and convert to formatted string
            time -> ...

        }
    }
}

【问题讨论】:

    标签: android kotlin android-livedata android-viewmodel


    【解决方案1】:

    您不能只更改 1 个值。创建一个新的数据类,表示业务逻辑转换后所需的完整对象

    例如来自

    data class ActionDetails(val time: Date, val firstName: String, val lastName: String)
    

    data class DisplayItem(val time: String, val firstName: String, val lastName: String, val fullName: String)
    

    然后将您的实时数据从List&lt;ActionDetails&gt; 转换为List&lt;DisplayItem&gt;。为此,您可以使用 Iterable#map 函数,该函数将转换应用于列表的每个元素并返回结果列表。

    Transformations.map(repository.liveStatus()) { list ->
        list.map { item ->
            val formattedTime = item.time.toString() // whatever you need
            val fullName = "${item.firstName} ${item.lastName}"
            DisplayItem(formattedTime, item.firstName, item.lastName, fullName)
        }
    }
    

    旁注:如果您想要更改的只是一件小事,也许不要使用Transformations.map,而只需在显示的位置格式化字符串,例如在适配器视图支架中

    【讨论】:

    • 感谢您的参与和相关的细节——我没有意识到我会建立一个新的列表。虽然我考虑过在数据绑定中格式化结果,但我不想将所有代码都放在 XML 中。我会试一试并重新评估我的选择。
    • 再考虑一下,我可能会在数据类中添加一个函数来处理这个值的格式,并从布局中的数据绑定调用该函数。这将使代码远离 XML 文件,但我不确定这种方法是否比转换更好。有意见吗?
    • @Bink 任何一个选项都没有大 +。每次更新实时数据 afaik 时,转换仅运行一次,这可以对列表视图的平滑滚动产生影响,例如,有时您可以在动态完成项目后处理时感觉到。但是字符串格式化日期是无关紧要的,所以无论哪种方式都可以正常工作
    猜你喜欢
    • 2019-10-10
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 2021-07-16
    • 2018-05-10
    • 1970-01-01
    相关资源
    最近更新 更多