Прежде всего, я действительно новичок в Android и, возможно, просто застрял в своей логике ... Я пытаюсь обойти эту проблему уже несколько дней.Я делаю приложение, в котором вы можете отслеживать сигареты, которые вы курили.мое дерево выглядит так:
мое дерево
Когда я добавляю запись, сохраняется время в миллисекундах и разница с последним дочерним элементом.Теперь, когда я добавляю запись, которая находится перед существующей записью (через Date / TimePicker), данные сортируются по time_in_millis правильно, но «diff_in_ms» неверно:
После добавлениязапись между
Это код, как я получаю Данные из предыдущей записи для вычисления diff_in_ms:
final Query lastQuery = drLast.child(db_date);
lastQuery.orderByChild("time_in_millis").limitToLast(1);
lastQuery.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue() != null) {
for (DataSnapshot LastDataSnap: dataSnapshot.getChildren()) {
LastEntry getLast = LastDataSnap.getValue(LastEntry.class);
ltim = getLast.getTime_in_millis();
}
} else {
ltim = calendar.getTimeInMillis();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Этот класс, который обрабатывает данные для заполнения ListView:
public class DataHandler {
//Handles Data before populating the List
private long time_in_millis, ms, ms1, diff_in_ms;
private String date, time, diff, db_date;
public DataHandler() {
}
public DataHandler(long time_in_millis, String date, String time, String diff, long diff_in_ms, String db_date) {
this.time_in_millis = time_in_millis;
this.date = date;
this.time = time;
this.diff = diff;
this.diff_in_ms = diff_in_ms;
this.db_date = db_date;
}
public long getTime_in_millis() {
return time_in_millis;
}
public String getDate() {
ms = time_in_millis;
SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.");
date = String.valueOf(dateFormat.format(ms));
return date;
}
public String getTime() {
ms1 = time_in_millis;
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");
time = String.valueOf(timeFormat.format(ms1));
return time;
}
public String getDiff() {
// I tried to get here the time_in_millis from the last child and calculate it, but the app always got stuck on the device
if (diff_in_ms != 0) {
diff = String.format("%02d" + "h " + "%02d" + "m", TimeUnit.MILLISECONDS.toHours(diff_in_ms),
TimeUnit.MILLISECONDS.toMinutes(diff_in_ms) % TimeUnit.HOURS.toMinutes(1));
} else {
diff = "---";
}
return diff;
}
public long getDiff_in_ms() {
return diff_in_ms;
}
public String getDb_date() {
return db_date;
Я пытался вычислить разницу при заполнении списка в моем классе модели, но приложение всегда зависало на телефоне.Теперь на мой вопрос: если diff_in_ms <0, тогда я должен обновить узлы "diff_in_ms" всех следующих потомков, потому что он связан с потомком и не обязательно с последним.Как это сделать? </p>
Или лучше рассчитать его при получении данных из БД?
Любая помощь приветствуется ...
РЕДАКТИРОВАТЬ: Сейчас этоработает с запросом в моем классе модели:
public class DataHandler {
//Handles Data before populating the List
private long time_in_millis, ms, ms1, ltim, diff_in_ms;
private String date, time, diff, db_date;
DatabaseReference drLast = FirebaseDatabase.getInstance().getReference();
Calendar calendar = Calendar.getInstance();
public DataHandler() {
}
public DataHandler(long time_in_millis, String date, String time, String diff, String db_date) {
this.time_in_millis = time_in_millis;
this.date = date;
this.time = time;
this.diff = diff;
this.db_date = db_date;
}
public long getTime_in_millis() {
return time_in_millis;
}
public String getDate() {
ms = time_in_millis;
SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.");
date = String.valueOf(dateFormat.format(ms));
return date;
}
public String getTime() {
ms1 = time_in_millis;
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");
time = String.valueOf(timeFormat.format(ms1));
return time;
}
public String getDiff() {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
db_date = format.format(calendar.getTime());
final Query lastQuery = drLast.child(db_date);
lastQuery.orderByChild("time_in_millis").limitToLast(1);
lastQuery.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue() != null) {
for (DataSnapshot LastDataSnap: dataSnapshot.getChildren()) {
DataToSave getLast = LastDataSnap.getValue(DataToSave.class);
ltim = getLast.getTime_in_millis();
}
} else {
ltim = calendar.getTimeInMillis();
}
//Calculate the difference
diff_in_ms = time_in_millis - ltim;
if (diff_in_ms != 0) {
diff = String.format("%02d" + "h " + "%02d" + "m", TimeUnit.MILLISECONDS.toHours(diff_in_ms),
TimeUnit.MILLISECONDS.toMinutes(diff_in_ms) % TimeUnit.HOURS.toMinutes(1));
} else {
diff = "---";
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
return diff;
}
public String getDb_date() {
return db_date;
}
}
Но он не показывает значений для различия в ListView.