You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Retrofit搭配RxJava请求数据无报错但RecyclerView不显示问题求助

问题排查与修复方案

核心问题:接口返回结构与接收类型不匹配

你提供的接口返回数据外层存在公共响应包装,并非直接返回Profile数组,你当前代码直接解析为List<Profile>会触发Gson解析异常,直接走onError回调,因此没有数据返回。

修复步骤

  1. 新增外层公共响应包装类
data class BaseResponse<T>(
    @SerializedName("status") val status: Boolean,
    @SerializedName("message") val message: String,
    @SerializedName("data") val data: T
)
  1. 修改请求接口定义
interface ProfileApi {
    @GET("familymembers/v2")
    fun getProfiles(): Single<BaseResponse<List<Profile>>>
}
  1. 修改服务类返回值
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<BaseResponse<List<Profile>>> {
        return api.getProfiles()
    }
}
  1. 调整ViewModel订阅逻辑
private fun fetchProfiles() {
    loading.value = true
    disposable.add(
        profileService.getProfile()
            .subscribeOn(Schedulers.io()) // 推荐用io线程而非newThread,复用线程池性能更好
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(object : DisposableSingleObserver<BaseResponse<List<Profile>>>() {
                override fun onSuccess(value: BaseResponse<List<Profile>>?) {
                    value?.takeIf { it.status }?.let { resp ->
                        profiles.value = resp.data
                        profileLoadingError.value = false
                    } ?: run {
                        profileLoadingError.value = true
                    }
                    loading.value = false
                }
                override fun onError(e: Throwable?) {
                    // 建议新增日志打印,方便后续排查问题
                    // Log.e("LoadError", e?.localizedMessage ?: "Unknown error", e)
                    profileLoadingError.value = true
                    loading.value = false
                }
            })
    )
}

其他可能问题排查

  • 检查AndroidManifest.xml是否已添加网络权限:<uses-permission android:name="android.permission.INTERNET" />
  • 检查Activity/Fragment中是否已观察profiles LiveData,收到数据后必须调用RecyclerView Adapter的更新方法(如notifyDataSetChanged()或者列表更新方法)刷新UI
  • 检查RecyclerView的LayoutManager、Adapter是否已正确绑定,Item布局参数是否正常

内容的提问来源于stack exchange,提问作者Ehtada Jodat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 11:09:02