Android Kotlin MVVM-您可以在recyclerview适配器中调用viewmodel吗?

时间:2019-05-11 13:49:54

标签: android mvvm kotlin android-recyclerview rx-java

我有一个对象列表,每个对象都有它自己的对象列表(有时也有一个列表)。

因此,对于主要对象列表,我有一个recyclerview。在主要对象的适配器内,我为次要对象列表创建了另一个recyclerview适配器。 (如果我得到一个具有3个嵌套列表的对象,嵌套就会像这样继续进行)

我使用MVVM体系结构。我从API接收数据,所以我在ViewModel中定义RxJava调用(一次性),然后在Activity中创建该ViewModel的实例并加载数据。

现在我的问题是,如何为嵌套的recyclerview列表加载数据? 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 :(得分:0)

不了解dagger,但似乎纯基于编译时声明的注入显然是一种局限性,在这种情况下会导致错误代码。 DI并不是解决所有问题的工具,有时甚至会使情况变得更糟,尤其是在针对JVM实现的情况下。