【发布时间】:2017-05-26 11:11:27
【问题描述】:
我正在使用 FirebaseRecyclerAdapter 为 RecyclerView 添加 Firebase 实时数据库提供的数据。
我开始按子节点date 对节点进行排序,该子节点设置为ServerValue.TIMESTAMP 的值。我将indexOn 属性添加到要排序的节点的父节点,并将值date 添加到Firebase 数据库规则。
"parent-node": {
".read": "auth != null",
".write": "auth != null",
".indexOn" : "date",
...
},
这工作正常,但更新的节点被添加到我的RecyclerView 的末尾。由于FirebaseRecyclerAdapter 和它的FirebaseArray 添加带有ChildEventListener 的节点,这意味着数据是从从最旧到最新排序的。
我设法通过使用ServerValue.TIMESTAMP 的负值来扭转这种情况。
private void prepareUpload() {
//mDatabase is a reference to the root of the Firebase Database
final DatabaseReference timestampReference = mDatabase.child("timestamp");
final String timestampKey = timestampReference.push().getKey();
timestampReference.child(timestampKey).setValue(ServerValue.TIMESTAMP);
timestampReference.child(timestampKey).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue() != null) {
if (!(Long.parseLong(dataSnapshot.getValue().toString()) < 0)) {
timestampReference.child(timestampKey).setValue(0 - Long.parseLong(dataSnapshot.getValue().toString()));
} else {
upload(/*Starting upload with new timestamp here (this is just a dummy method)*/);
timestampReference.child(timestampKey).removeValue();
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.e(TAG, databaseError.getMessage());
}
});
}
现在我要排序的节点如下所示。
{
"-K_tlLWVO21NXUjUn6ko" : {
"date" : -1483806697481,
"debug" : "old",
...
},
"-K_tmjVqTUcKXHaQDphk" : {
"date" : -1483807061979,
"debug" : "newer",
...
},
"-K_uC-AJIvDOuBzhJ3JJ" : {
"date" : -1483813945897,
"debug" : "newest",
...
}
}
它们从最新到最旧排序,并完全按照我的意愿添加到我的RecyclerView 顶部。
关于我的个人问题:
- 这是从最新到最旧对节点进行排序的正确方法吗?这对我来说似乎是一个很大的解决方法。
- 我错过了什么吗?
提前致谢!
编辑:我刚刚看到我的prepareUpload() 方法无用地将负值再次发送到数据库,只是为了之后再次接收它。我将更改它以计算客户端的负值。请忽略这一点。
【问题讨论】:
标签: android sorting firebase firebase-realtime-database