Android kotlin MVVM - можете ли вы вызвать viewmodel внутри утилиты recyclerview? - PullRequest
0 голосов
/ 11 мая 2019

У меня есть список объектов, и у каждого объекта есть свой список объектов (который иногда тоже есть).

Итак, у меня есть один обзор переработчиков для списка основных объектов. Внутри адаптера для основных объектов я создаю еще один адаптер для списка вторичных объектов. (И вложение продолжается так, если я получаю объект, который имеет 3 вложенных списка)

Я использую архитектуру MVVM. Я получаю свои данные из API, поэтому я определяю вызов RxJava (Disposable) внутри ViewModel, затем создаю экземпляр этого ViewModel внутри Activity и загружаю данные.

Теперь мой вопрос: как я могу загрузить данные для вложенных списков повторного просмотра? ViewModel уникален для действия, и я не могу вызвать viewModel внутри адаптера (так как я использую кинжал и инъекция работает только в деятельности)

Примеры данных: Итак, в этих примерах я получу объект Person, внутри этого объекта есть список с объектами Car, а внутри этого списка еще один список объектов Submodel.

Вложенный объект json:

{
    "personId": 1,
    "personName": "Bert",
    "personAge": 19,
    "isFemale": "false",
    "cars": [
                 {
            "carId": 1,
            "personId": 1,
            "carMake": "BWM",
            "model": "E36",
            "submodels": [{
                "submodelId": 1,
                "carId": 1,
                "submodelName": "335i"
            }, {
                "submodelId": 2,
                "carId": 1,
                "submodelName": "330d"
            }]
        }, {
            "carId": 2,
            "personId": 1,
            "carMake": "Porsche",
            "model": "911",
            "submodels": [{
                    "submodelId": 3,
                    "carId": 2,
                    "submodelName": "Carrera 4S"
                },
                {
                    "submodelId": 4,
                    "carId": 2,
                    "submodelName": "GT3 RS"
                }]
        }],
        "birthDate": "2000-06-28T00:00:00"

}

ApiInterface:

@GET("persons/{id}")
fun getPerson(@Path("id) id: Int: Observable<Person>

PersonRepo:

  class PersonsRepository @Inject constructor(val apiInterface: ApiInterface) {
 fun getPersons(personId: Int): Observable<Person>{
   return apiInterface.getPerson(personId)
 }
}

PersonViewModel:

class PersonViewModel @Inject constructor(private val personRepositoy: PersonRepository) : ViewModel() {
  var personResult: MutableLiveData<Person> = MutableLiveData()
  var personError: MutableLiveData<String> = MutableLiveData()
  lateinit var personDisposable: Disposable

  fun personResult(): LiveData<Person> {
    return personResult
  }
  fun personError(): LiveData<String> {
    return personError
  }

  fun loadPerson(personId: Int) {
    personDisposable = personRepository
    .getPerson(personId)
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe({
      personResult.postValue(it)
  }, {
      personError.postValue(it.message)
  })

  fun disposeElements(){
      if(::personDisposable.isInitialized && !personDisposable.isDisposed) {
            personDisposable.dispose()
        }
    }
}

Модели будут выглядеть так: PersonModel:

data class Person (
  @Json(name = "personId")
  val personId: Int,

  @Json(name = "personName")
  val name: String,

  @Json(name = "personAge")
  val age: Int,

  @Json(name = "isFemale")
  val isFemale: Boolean,

  @Json(name = "cars")
  val cars: List<Car>

  @Json(name = "birthDate")
  val birthDate: GregorianCalendar

)

Автомобиль:

data class Car(
  @Json(name = "carId")
  val carId: Int,

  @Json(name = "carMake")
  val carMake: String,

  @Json(name = "model")
  val model: String,

  @Json(name = "submodels")
  val submodels: List<SubModel>
)

подмодели:

data class SubModel(
  @Json(name = "submodelId")
  val submodelId: Int,

  @Json(name = "carId")
  val carId: Int,

  @Json(name = "submodelName")
  val submodelName: String
)

1 Ответ

0 голосов
/ 11 мая 2019

Не знаю насчет кинжала, но кажется, что чисто внедрение на основе объявлений во время компиляции явно является ограничением, которое в этом случае приведет к плохому коду.DI - это не инструмент для решения всех проблем, иногда он даже ухудшает ситуацию, особенно при реализации JVM-реализаций.

...