Java 如何在recyclerview中更新相对时间?

Java 如何在recyclerview中更新相对时间?,java,android,android-recyclerview,android-dateutils,Java,Android,Android Recyclerview,Android Dateutils,我有一个RecyclerView,它显示带有标题、文本和上次编辑时间的项目。 在RecyclerView适配器的onBindViewHolder中,我使用getRelativeTimeSpanString并将Notes对象的时间与当前时间进行比较: @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { Note note = getItem(position); ho

我有一个RecyclerView,它显示带有标题、文本和上次编辑时间的项目。

在RecyclerView适配器的onBindViewHolder中,我使用
getRelativeTimeSpanString
并将Notes对象的时间与当前时间进行比较:

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    Note note = getItem(position);
    holder.title.setText(note.getTitle());
    holder.text.setText(note.getText());

    String s = DateUtils.getRelativeTimeSpanString(note.getTime(), 
    System.currentTimeMillis(), 0L, DateUtils.FORMAT_ABBREV_ALL).toString();
    holder.timestamp.setText(s);
}
如果我刚刚添加了项目,它会显示“0秒前”。随着时间的推移,我如何更新它

在写这个问题时,SO提出了这个问题:,但是我不认为每X秒更新一次RecyclerView是最好的主意:

  • 它会耗尽电池电量
  • 它会更新不需要更新的项目(例如。, 上次更新是在6小时前,但它正在更新
    holder.timestamp
    每X秒)

  • 有没有更有效的方法来实现这一点?

    如果您只需要在UI可见时更新它,那么您可以通过在片段/Acitvity中使用
    onResume()
    onPause()
    生命周期回调来更新您的UI,从而减少电池消耗。此外,如果分钟粒度对于您的用例来说足够好,那么您可以使用
    操作\u时间\u TICK
    系统广播,它每一分钟触发一次,因此您不需要不必要地创建自己的计时器

    首先,注册一个
    BroadcastReceiver
    以在
    onResume()
    中收听此广播,然后在
    onPause()中取消注册:

    接收器
    中,包含更新
    回收视图
    相关项的逻辑(或将其委托给
    适配器
    ,作为一个粗略的示例:

    final BroadcastReceiver receiver = new BroadcastReceiver() {
       @Override
       public void onReceive(Context context, Intent intent) {
          adapter.updateTimes();
       }
    }
    
    //Inside your Adapter...
    void updateTimes() {
        for(int i = 0; i < notes.size(); i++) {
           final Note note = notes.get(i);
           //Pseudocode for determening whether or not an update it necessary
           //Actual implementation will depend on how you handle updates
           final String relative = getCurrentRelativeTimeString(); 
           if(!Objects.equals(relative, note.getRelativeTimeString())) {
               note.setRelativeTimeString(relative);
               notifyItemChanged(i);
           }
        }
    }
    
    final BroadcastReceiver=新的BroadcastReceiver(){
    @凌驾
    公共void onReceive(上下文、意图){
    adapter.updateTimes();
    }
    }
    //在适配器内部。。。
    void updateTimes(){
    对于(int i=0;i
    这次您只需在UI可见时进行更新,因此不会对性能/电池造成太大影响。如果您的用例可以接受每分钟检查一次更新,则您可以在
    onResume()中注册系统每分钟发送的“时间刻度”意图
    如果您的活动/片段,请在
    onPause()中注销
    ,因此您甚至不需要创建新的计时器机制。@p如果您是对的,我只需要在UI可见时更新。我是否在适配器上调用notifyDataSetChanged?对于旧项目,是否有比notifyDataSetChanged更精细的方法,例如,每小时更新一次?如果您使用的是
    RecyclerView
    ,然后是-您可以添加一个
    BroadcastReceiver
    ,带有每分钟触发的意图过滤器
    intent.ACTION\u TIME\u TICK
    。我循环查看所有便笺对象,如果现在和便笺时间之间的差异是我需要的,那么我会更新时间。这正是我想要的!您可以作为答案发布,谢谢!
    final BroadcastReceiver receiver = new BroadcastReceiver() {
       @Override
       public void onReceive(Context context, Intent intent) {
          adapter.updateTimes();
       }
    }
    
    //Inside your Adapter...
    void updateTimes() {
        for(int i = 0; i < notes.size(); i++) {
           final Note note = notes.get(i);
           //Pseudocode for determening whether or not an update it necessary
           //Actual implementation will depend on how you handle updates
           final String relative = getCurrentRelativeTimeString(); 
           if(!Objects.equals(relative, note.getRelativeTimeString())) {
               note.setRelativeTimeString(relative);
               notifyItemChanged(i);
           }
        }
    }