Retrofit 不显示任何数据

Retrofit does not show any data

我正在尝试 retrieve/fetch 使用改造和 Rxjava 从服务器获取数据以在回收器视图中显示数据。该代码未检测到任何错误,但仍未显示任何数据。请检查我的代码并帮助我在哪里弄错了。 这是我的 API https://www.testing.albassamapp.com/api/familymembers/v2

这是我的数据class 代码:

data class Profile(
    @SerializedName("id")
    val id: Int,
    @SerializedName("name")
    val name: String,
    @SerializedName("father_name")
    val fatherName: String,
    @SerializedName("profile_picture_square")
    val profilePicture: String
)

这是我的界面:

interface ProfileApi {
    
    @GET("familymembers/v2")
    //single is observable it emit one variable and then close
    fun getProfiles(): Single<List<Profile>>
}

这是我的服务class:

class ProfileService {
   private val BASE_URL = "https://www.testing.albassamapp.com/api/"

    private val api:ProfileApi

    init {
        api = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build()
            .create(ProfileApi::class.java)
    }

    fun getProfile(): Single<List<Profile>> {
        return api.getProfiles()
    }

}

这是我的 listViewModel:

class ListViewModel:ViewModel() {

    private val profileService = ProfileService()
    private val disposable = CompositeDisposable()

    //for live data
    val profiles = MutableLiveData<List<Profile>>()
    val profileLoadingError = MutableLiveData<Boolean>()

    val loading = MutableLiveData<Boolean>()

    fun refresh() {
        fetchProfiles()
    }
    private fun fetchProfiles() {
        loading.value = true
        disposable.add(
            profileService.getProfile()
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(object : DisposableSingleObserver<List<Profile>>() {
                    override fun onSuccess(value: List<Profile>?) {
                        profiles.value = value
                        profileLoadingError.value = false
                        loading.value = false
                    }
                    override fun onError(e: Throwable?) {
                        profileLoadingError.value = true
                        loading.value = false
                    }
                })
        )
    }
    override fun onCleared() {
        disposable.clear()
    }
}

你犯了一个错误,基于对 api 的响应,serlizable 是错误的,api 响应是 json 对象包含你在 [=27] 中更改 return 的配置文件列表=] 界面 首先创建对象

这是你的数据class

 data class Profile(
@SerializedName("id")
val id: Int,
@SerializedName("name")
val name: String,
@SerializedName("father_name")
val fatherName: String,
@SerializedName("profile_picture_square")
val profilePicture: String
)

在您的数据中添加新的 class class

    data class Result(
     @SerializedName("Status")
      val status: Int,
      @SerializedName("Message")
      val message: String,
    @SerializedName("Data")
    val data: List<Profile>
     )

你的界面改成这个样子

interface ProfileApi {

@GET("familymembers/v2")
//single is observable it emit one variable and then close
fun getProfiles(): Single<Result>
}

你的服务会是这样

class ProfileService {
 private val BASE_URL = "https://www.testing.albassamapp.com/api/"

 private val api:ProfileApi

 init {
    api = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .build()
        .create(ProfileApi::class.java)
}

fun getProfile(): Single<Result> {
    return api.getProfiles()
}

}

你的视图模型会像这样

class ListViewModel: ViewModel() {

 private val profileService = ProfileService()
 private val disposable = CompositeDisposable()

  //for live data
  val profiles = MutableLiveData<List<Profile>>()
  val profileLoadingError = MutableLiveData<Boolean>()

   val loading = MutableLiveData<Boolean>()

    fun refresh() {
      fetchProfiles()
  }
  private fun fetchProfiles() {
     loading.value = true
     disposable.add(
       profileService.getProfile()
       .subscribeOn(Schedulers.newThread())
       .observeOn(AndroidSchedulers.mainThread())
       .subscribeWith(object : DisposableSingleObserver<Result>() {
         override fun onSuccess(result: Result) {
        if(result.status==200){
          profiles.value = result.data
          profileLoadingError.value = false
        }else{
          // in case exception or message
          profileLoadingError.value = true
        }
        loading.value = false
      }

      override fun onError(e: Throwable) {
        profileLoadingError.value = true
        loading.value = false
      }

    })
  )
  }
 override fun onCleared() {
  disposable.clear()
   }
 }

我把上面@yousef的回答改成了下面的,因为我因为某些原因无法编辑,而且英文有点不清楚

你犯了一个错误,根据 api 的响应模型是错误的,api 响应是 json 包含其他模型对象列表的对象说 Profile 你必须在 api 接口中更改返回的模型,例如 首先创建模型Result

data class Result(
 @SerializedName("Status")
 val status: Int,
 @SerializedName("Data")
 val data: List<Profile>
)

然后像这样Profileclass

data class Profile(
 @SerializedName("id")
 val id: Int
 @SerializedName("parent_id")
 val parentId: Int // and so on based on the fields you need
)

只需更改界面即可 api 像这样获取对象结果

  fun getProfiles(): Single<Result>.

然后相应地这将更改其他代码,您可以使用默认提供的 getter 获取 Result class 的 List<Profile> 属性 Kotlin

的数据class

此外,为了减少从 json 制作模型时的头痛,您可以使用 Json2Kotlin

等网站