ViewModel, LiveData и Transformations.map - PullRequest
       7

ViewModel, LiveData и Transformations.map

0 голосов
/ 15 октября 2018

Новичок в разработке 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>>

ViewModel

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 -> ...

        }
    }
}

1 Ответ

0 голосов
/ 16 октября 2018

Вы не можете изменить только 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<ActionDetails> до List<DisplayItem>.Для этого вы можете использовать функцию 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)
    }
}

Sidenote: если вы хотите изменить только одну маленькую вещь,возможно, не используйте Transformations.map, а просто отформатируйте строку в том месте, где она отображается, например, в держателе вида адаптера

...