Akr*_*res 2 java android android-dateutils android-recyclerview
我有一个 RecyclerView 显示带有标题、文本和上次编辑时间的项目。
在 RecyclerView 适配器的 onBindViewHolder 中,我使用getRelativeTimeSpanString
并将笔记对象的时间与当前时间进行比较:
@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);
}
Run Code Online (Sandbox Code Playgroud)
如果我刚刚添加了该项目,它会显示“0 秒前”。我如何随着时间的推移更新它?
在写这个问题时,SO 提出了这个问题:更新 android 中的相对时间,但是我不认为每 X 秒更新一次 RecyclerView 是最好的主意:
holder.timestamp
每 X 秒更新一次)有没有更有效的方法来实现这一目标?
鉴于您只需要在 UI 可见时更新它,您可以通过使用Fragment/Acitvity 中的onResume()
和onPause()
生命周期回调仅在您知道它在前台时更新您的 UI 来减少电池消耗。此外,如果分钟粒度对于您的用例来说足够好,您可以使用ACTION_TIME_TICK
系统广播,它每一分钟触发一次,因此您不需要不必要地创建自己的计时器。
首先,在 中注册一个BroadcastReceiver
来监听这个广播onResume()
,然后在 中取消注册onPause()
:
@Override
public void onResume() {
final IntentFilter filter = new IntentFilter(Intent.ACTION_TIME_TICK);
getContext().registerReceiver(receiver, filter);
}
@Override
public void onPause() {
getContext().unregisterReceiver(receiver);
}
Run Code Online (Sandbox Code Playgroud)
在 内receiver
,包含更新您的相关项目的逻辑RecyclerView
(或将其委托给您的Adapter
,作为一个粗略的例子:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
658 次 |
最近记录: |