Android集成Firestore读取日期时调用TextView.setText失败的问题
问题背景
在Android Studio中实现Firestore数据读取到本地的功能时,除日期字段外其余字段均可正常获取展示。经断点调试确认,已能正常拿到日期字段的值,但无法成功将日期值设置到对应TextView上。
Firestore中History集合的数据结构如下:
现有问题代码
RecyclerView Adapter实现
adapter = new FirestoreRecyclerAdapter<History, BusViewHolder>(options) { @Override protected void onBindViewHolder(@NonNull BusViewHolder holder, int position, @NonNull History model) { // holder.time.setText(model.getDate()); holder.name.setText(String.valueOf(model.getFullName())); holder.medicine.setText(model.getMedicine()); holder.illness.setText(model.getIllness()); Long timestamp=model.getDate().getTime(); String todisplaycurrenttimewithdate = getTimeDate(timestamp); //SimpleDateFormat sfd = new SimpleDateFormat("dd/MM/yyyy HH:mm", Locale.getDefault()); SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yy HH:mm"); String dateString = formatter.format(new Date(todisplaycurrenttimewithdate)); holder.time.setText(dateString);//问题出在这一行 } @NonNull @Override public BusViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(AdminHistoryActivity.this).inflate(R.layout.history_recyclerview, parent, false); return new BusViewHolder(view); } }; recyclerView.setAdapter(adapter); }
日期转换工具方法
public static String getTimeDate(long timestamp){ try{ Date netDate = (new Date(timestamp)); SimpleDateFormat sfd = new SimpleDateFormat("dd/MM/yy HH:mm", Locale.getDefault()); return sfd.format(netDate); } catch(Exception e) { return "date"; } }
故障原因
代码存在逻辑错误:
getTimeDate()方法的返回值是已经格式化完成的String类型日期字符串- 后续代码错误地将这个字符串传入
new Date()构造方法尝试生成Date对象,Date类没有可直接解析dd/MM/yy HH:mm格式字符串的公开构造方法,这一步会抛出隐式异常,导致最终生成的dateString值异常,无法正常显示到TextView。
修复方案
删除重复的格式化逻辑即可,二选一即可实现正常展示:
- 方案1:直接复用已写好的
getTimeDate()工具方法
@Override protected void onBindViewHolder(@NonNull BusViewHolder holder, int position, @NonNull History model) { holder.name.setText(String.valueOf(model.getFullName())); holder.medicine.setText(model.getMedicine()); holder.illness.setText(model.getIllness()); Long timestamp = model.getDate().getTime(); // 直接获取格式化完成的时间字符串设置 holder.time.setText(getTimeDate(timestamp)); }
- 方案2:移除独立工具方法,在绑定逻辑中直接完成格式化
@Override protected void onBindViewHolder(@NonNull BusViewHolder holder, int position, @NonNull History model) { holder.name.setText(String.valueOf(model.getFullName())); holder.medicine.setText(model.getMedicine()); holder.illness.setText(model.getIllness()); Long timestamp = model.getDate().getTime(); // 创建格式化器时指定Locale,避免多语言环境下格式错乱 SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yy HH:mm", Locale.getDefault()); String dateString = formatter.format(new Date(timestamp)); holder.time.setText(dateString); }
补充提示:
SimpleDateFormat是线程非安全类,Android开发中如果适配到API26及以上,推荐使用java.time包下的时间API替代老旧的Date/SimpleDateFormat,可避免大量时间处理的隐藏问题;低版本可通过开启coreLibraryDesugaring兼容使用新时间API。
内容的提问来源于stack exchange,提问作者Angel
相关产品推荐
相关产品推荐

