У меня есть приложение для Android с этими классами:
ListActivity отображает все объекты Item в ListView
DetailActivity должен отображать все свойства объекта, используя другой ListView.
Item - это мой объект, содержащий field1, field2 и т. д.
ListActivity передает DetailActivityitemId, используя дополнительный параметр намерения, когда пользователь щелкает элемент ListActivity.
Поток должен быть:
DetailActivity создает экземпляр DetailViewModel, передавая itemIdDetailViewModel получить от Repository объект LiveData<Item>, идентифицированный предоставленным itemIdDetailViewModel создает List<NameValueBean>, используя поля LiveData<Item> (propertiesList.add(new NameValueBean("field1", item.getField1()); ...)DetailActivity наблюдает за List<NameValueBean> и использует его для питания DetailAdapter, который является контроллером деталей ListView.Проблема в том, что List<NameValueBean> должен быть наблюдаемым, поэтому должен быть LiveData<List<NameValueBean>>, создаваемый каждый раз, когда LiveData<Item> изменяется.
Как я могу это получить? Я думаю, что нужно сделать Трансформация, но я не понимаю, как это реализовать.
Вы должны выполнить этот процесс после наблюдения за своим 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()
}
}
пожалуйста, разместите код для следующих классов
NameValueBean,ItemиDetailViewModel. Также добавьте прослушиватель щелчков элемента списка.