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

Android集成Firestore读取日期时调用TextView.setText失败的问题

问题背景

在Android Studio中实现Firestore数据读取到本地的功能时,除日期字段外其余字段均可正常获取展示。经断点调试确认,已能正常拿到日期字段的值,但无法成功将日期值设置到对应TextView上。

Firestore中History集合的数据结构如下:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 17:06:29