Java 如何在recyclerview中更新相对时间?
我有一个RecyclerView,它显示带有标题、文本和上次编辑时间的项目。 在RecyclerView适配器的onBindViewHolder中,我使用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
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是最好的主意:
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);
}
}
}