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

MVVM架构下Kotlin如何从Retrofit嵌套JSON响应中提取lfs列表展示

解决方案

核心思路

你当前返回的JSON根列表仅包含1个sf对象,所有需要展示的8条数据都存放在该对象的lfs字段中,只需逐层修改各层的数据源类型,提取lfs列表作为适配器数据源即可。

具体修改步骤

1. 调整Repository层逻辑

将返回的LiveData泛型从sf列表改为lfs列表,请求成功后提取lfs数组赋值:

object WordsRepository {
    var call: Call<MutableList<sf>>? = null
    // 修改返回值泛型为lfs列表
    fun getMutableLiveData(context: Context) : MutableLiveData<ArrayList<lfs>> {
        val mutableLiveData = MutableLiveData<ArrayList<lfs>>()
        call = NetworkApiClient.apiService.getWordsMatching("HMM")
        call!!.enqueue(object : Callback<MutableList<sf>> {
            override fun onFailure(call: Call<MutableList<sf>>, t: Throwable) {
                Log.e("error", t.localizedMessage.toString())
            }
            override fun onResponse(call: Call<MutableList<sf>>, response: Response<MutableList<sf>>)
            {
                if (!response.isSuccessful){
                    Log.e("Code " , response.code().toString());
                    return
                }
                val usersResponse : MutableList<sf>? = response.body()
                // 提取lfs列表,增加空判断避免崩溃
                val lfsList = usersResponse?.firstOrNull()?.lfs ?: emptyList()
                mutableLiveData.value = ArrayList(lfsList)
            }
        })
        return mutableLiveData
    }
}

2. 调整ViewModel层泛型

同步修改LiveData的泛型类型:

class WordsViewModel ( context: Context) : ViewModel() {
    // 修改泛型为lfs列表
    private var listData = MutableLiveData<ArrayList<lfs>>()
    init {
        val wordRepository: WordsRepository by lazy { WordsRepository }
        listData = wordRepository.getMutableLiveData(context)
    }
    // 修改返回值类型
    fun getData(): MutableLiveData<ArrayList<lfs>> {
        return listData
    } 
}

3. 调整Activity与适配器逻辑

修改数据源类型、Observer监听类型,同步修改适配器接收的数据源类型,同时调整适配器内部的item绑定逻辑,读取lfs类的字段渲染即可:

// 数据源改为lfs列表
listUsers = mutableListOf<lfs>()
adapter = WordAdapters(this, listUsers )
recyclerView.adapter = adapter

wordViewModel = ViewModelProviders.of(this,
    WordViewModelFactory(this)).get(WordsViewModel::class.java)
// 监听lfs列表数据
wordViewModel!!.getData().observe(this, { t: ArrayList<lfs>? ->
    listUsers.clear()
    t?.let { listUsers.addAll(it) }
    adapter.notifyDataSetChanged()
})

补充说明

建议将数据类命名改为大驼峰格式(sf改为Sf、lfs改为Lf、vars改为Var),符合Kotlin编码规范,避免后续混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:36:03