Использование LiveData и преобразования

У меня есть приложение для Android с этими классами:

  • ListActivity отображает все объекты Item в ListView

  • DetailActivity должен отображать все свойства объекта, используя другой ListView.

  • Item - это мой объект, содержащий field1, field2 и т. д.

ListActivity передает DetailActivityitemId, используя дополнительный параметр намерения, когда пользователь щелкает элемент ListActivity.

Поток должен быть:

  1. DetailActivity создает экземпляр DetailViewModel, передавая itemId
  2. DetailViewModel получить от Repository объект LiveData<Item>, идентифицированный предоставленным itemId
  3. DetailViewModel создает List<NameValueBean>, используя поля LiveData<Item> (propertiesList.add(new NameValueBean("field1", item.getField1()); ...)
  4. DetailActivity наблюдает за List<NameValueBean> и использует его для питания DetailAdapter, который является контроллером деталей ListView.

Проблема в том, что List<NameValueBean> должен быть наблюдаемым, поэтому должен быть LiveData<List<NameValueBean>>, создаваемый каждый раз, когда LiveData<Item> изменяется.

Как я могу это получить? Я думаю, что нужно сделать Трансформация, но я не понимаю, как это реализовать.

пожалуйста, разместите код для следующих классов NameValueBean, Item и DetailViewModel. Также добавьте прослушиватель щелчков элемента списка.

Ashish Kudale 23.11.2018 17:15
2
1
316
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны выполнить этот процесс после наблюдения за своим LiveData<Item> в Activity.

Ответ принят как подходящий

Лучше всего для этого подойдет функция Transformations.map.

Чтобы дать больше контекста, Transformations.map возьмет LiveData<T>, выполнит преобразование и превратит его в LiveData<Y>.

Метод принимает LiveData<T> и лямбду, цель которой - преобразовать значение, выдаваемое LiveData, T, в новое значение Y.

Transformations.map примет значение, испускаемое данным LiveData<T>, отобразит и вернет LiveData<Y>.

Примечание: это преобразование будет выполнено в основном потоке.

Источник: https://developer.android.com/reference/android/arch/lifecycle/Transformations#map


Быстрый ответ:

fun getNameValueBeanLiveData(itemId: Int): LiveData<List<NameValueBean> {
    val itemLiveData: LiveData<Item> = repository.getItemLiveData(itemId)
    return Transformations.map(itemLiveData) { item ->
        val nameValueBeanList = mutableListOf<NameValueBean>()
        return nameValueBeanList.apply {
            add("field1", item.field1)
            add("field2", item.field2)
            ...
        }.toList()
    }
}

Другие вопросы по теме