Java中Retrofit返回String日期转LocalDate后调用setText报错如何解决?
报错原因
TextView.setText() 方法仅接受 CharSequence(字符串)类型参数,你当前 Worker 类中存储的生日字段为 LocalDate 类型,直接传入必然触发类型不匹配的报错。
可选解决方案
方案1:绑定视图时实时转换(推荐,保留原始日期类型方便后续业务计算)
这种方案无需改动现有数据存储逻辑,仅需要在给TextView赋值时将LocalDate转为格式化字符串即可。
- 先在RecyclerView Adapter中全局创建日期格式化器,避免在
onBindViewHolder中反复创建损耗性能:
// 可根据需要调整显示的日期格式,比如改成"yyyy年MM月dd日" private final DateTimeFormatter BIRTHDAY_DISPLAY_FORMAT = DateTimeFormatter.ofPattern("dd/MM/yyyy", Locale.getDefault());
- 修改
onBindViewHolder中生日赋值的代码:
// 先把LocalDate格式化为字符串再传给setText holder.birthday.setText(workerList.get(position).getBirthday().format(BIRTHDAY_DISPLAY_FORMAT));
方案2:存储数据时直接存格式化后的字符串
如果你的业务场景不需要用到LocalDate做日期比较、计算等操作,可以直接在解析接口数据时就把生日转成字符串存入Worker类,后续无需额外转换:
- 修改
Worker类中birthday字段的类型为String,同步修改对应的getter、setter方法。 - 改动接口请求回调中的解析逻辑:
DateTimeFormatter format = DateTimeFormatter.ofPattern("dd/MM/yyyy", Locale.getDefault()); // 先解析成LocalDate校验日期格式合法性,再转成目标格式的字符串 LocalDate tempDate = LocalDate.parse(response.body().getResponse().get(i).getBirthday(), format); String formatBirthday = tempDate.format(format); // 构造Worker时传入字符串类型的生日 workerList.add(new Worker(f_name, l_name, formatBirthday, SpecName, SpecId, AvatarUrl));
这种方案下onBindViewHolder中的原有赋值代码不需要改动。
注意事项
如果你的App需要兼容Android 8.0(API 26)以下的设备,需要在项目中开启Java 8 desugaring支持,否则LocalDate、DateTimeFormatter等类会触发找不到类的运行时异常。
内容的提问来源于stack exchange,提问作者Liannes
相关产品推荐
相关产品推荐

