如何从Kotlin数据类提取字段值传递给RecyclerView Adapter展示
实现方案
首先可以明确:你可以结合flatMap和map函数完成需求,写法比手动循环简洁很多,完全符合Kotlin的函数式编程习惯。
先修正数据类的潜在问题
你当前定义的数据类有两个小坑需要先调整,否则接口解析时会直接崩溃:
- 接口返回的
birthday字段可能为null,你目前定义的是非空String类型,需要改为可空类型String? - 你声明了
avatrUrl字段并加了@SerializedName("avatr_url")注解,但接口返回的JSON里根本没有这个字段,建议改为可空类型并设置默认值:val avatrUrl: String? = null
修正后的Response数据类参考:
data class Response( @SerializedName("avatr_url") val avatrUrl: String? = null, val birthday: String?, @SerializedName("f_name") val fName: String, @SerializedName("l_name") val lName: String, val specialty: List<Specialty> )
提取specialty名称的代码实现
你需要的是所有员工关联的所有岗位的名称,因为每个员工对应一个specialty列表,属于嵌套列表结构,所以先用flatMap把内层的Specialty列表铺平为单层列表,再用map提取name字段即可:
// 假设你已经拿到接口返回的EmployeesInfo实例,变量名为employeesInfo val specialtyNameList = employeesInfo.response // 把所有员工的specialty列表展开,得到一个全局的List<Specialty> .flatMap { it.specialty } // 提取每个Specialty的name字段 .map { it.name }
可选扩展操作
- 如果需要去重,直接在末尾加
.distinct()即可,比如你示例中的两个员工都是同一个岗位,去重后列表只会保留一个值 - 如果
name字段可能为null,可以把map换成mapNotNull过滤空值:.mapNotNull { it.name }
传给RecyclerView Adapter
拿到specialtyNameList之后,直接更新Adapter的数据集即可:
- 如果你用的是普通自定义Adapter,把数据集替换为新列表后调用
notifyDataSetChanged() - 如果你用的是
ListAdapter,直接调用adapter.submitList(specialtyNameList)即可
补充说明
如果你只用map不用flatMap的话,employeesInfo.response.map { it.specialty }得到的会是List<List<Specialty>>嵌套列表,没法直接提取名称,所以必须用flatMap做列表铺平操作。
内容的提问来源于stack exchange,提问作者user459666
相关产品推荐
相关产品推荐

