Использование LiveData и Transformation - PullRequest
0 голосов
/ 23 ноября 2018

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

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

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

  • Item мой объект, который содержит field1, field2 и т. Д.

ListActivity переходит к DetailActivity itemId с использованием дополнительного параметра намерения, когда пользователь щелкает элемент 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>.

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

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Функция 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()
    }
}
0 голосов
/ 23 ноября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...