Я новичок в шаблоне MVVM, и это общий вопрос для меня, но я приведу конкретный пример.
У меня есть:
- Класс данных
Place
который содержит широту, долготу, имя и т. д. - A
MapsViewModel
, который содержит список мест LiveData<List<Place>>
, используемый MapsFragment
- И
MapsFragment
, который представляет View
шаблона MVVM.
Насколько я понимаю, View
должен не замечать Model
, в этом случае MapsFragment
не должен знать о Place
модели.
Я хочу заполнить Карту маркерами, но маркерам нужны широта и долгота (и другие параметры, такие как имя и т. Д.), Поэтому я должен наблюдать за списком мест и сопоставлять каждую запись в списке с маркером.
Я не уверен, должен ли я размещать код для сопоставления мест с маркерами внутри MapsViewModel
, чтобы MapsFragment
мог просто вызвать mapsViewModel.getMarkers()
и использовать этот список маркеров для заполнения карты, или если MapsFragment
соблюдайте mapsViewModel.getPlaces()
и из списка ответов отобразите маркерыи затем заполните карту.
Если MapsViewModel
должен отвечать за отображение мест, как я буду наблюдать за изменениями в LiveData
, если будут добавлены новые местоположения?
ЕслиMapsFragment
должен отвечать за отображение, не нарушает ли это шаблон MVVM, где Views
не должен знать о модели?
Пример написан на Kotlin
, но я не пометилвопрос с Kotlin
, потому что это не зависит от языка.
В моих текущих реализациях я наблюдаю места LiveData<List<Place>>
// MapsFragment
...
override fun onMapReady(googleMap: GoogleMap) {
mMap = googleMap
mapsViewModel.getPlaces().observe(this, Observer { places ->
places?.forEach { place ->
var options = MarkerOptions()
options.position(LatLng(place.lat.toDouble(), place.lon.toDouble()))
mMap.addMarker(options)
}
})
}
...
// MapsViewModel
...
fun getPlaces(): LiveData<List<Place>> {
return Repositories.placesRepository.getPlaces()
}
...
PS Один боковой вопрос для ListViews идругие типы коллекций: должна ли каждая ячейка иметь свой собственный ViewModel
или весь ListView должен иметь только один ViewModel
?