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
相关产品推荐
相关产品推荐

