私は、タイトル、テキストと最後の編集時のディスプレイアイテムというRecyclerViewを持っています。
RecyclerViewアダプタのonBindViewHolder Iの使用では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);
}
私はちょうど項目を追加した場合、それは「0秒前」と言います。どのように私はその時間をかけて更新していますか?
:この質問を書いている間、SOこの質問を示唆アンドロイドの相対的な時間の更新をしかし、私は最高のアイデアをRecyclerView X秒ごとに更新されたとは思いません、:
- それは、バッテリーを消耗します
- それが更新を必要としない項目を更新する(例えば、最後の更新は6時間前だったが、それは更新しています
holder.timestamp
すべてのX秒)
これを達成するためのより効率的な方法はありますか?
あなたはそれだけが表示されているときにUIを更新する必要を考えると、あなたはそれを使用してフォアグラウンドであることを知っている場合にのみ、あなたのUIを更新することにより、電池の消耗を減らすことができますonResume()
し、onPause()
あなたのフラグメント/ Acitvityにおけるライフサイクルコールバックを。分単位でご利用の場合のために良い十分である場合に加えて、あなたは使用することができ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);
}
内部は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);
}
}
}