我开始使用Firebase,一切看起来都很不错,但是在recyclerview
中有5万条记录可以显示,我无法弄清楚如何进行分页或类似操作,因为一次加载所有内容会花费太多时间。
我也没有运气,也使用过childEventListener
和FirebaseUI。
更新1:
最终,我得到了更新1的支持,这不是最好的解决方案,但我想以后要进行一些更改。
private String lastKey = null;
private List<Comment> commentList = new ArrayList<>();
private final static int QUERY_LIMIT = 20;
private int page = 0;
private void loadComments() {
page++;
ChildEventListener childEventListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Comment comment = dataSnapshot.getValue(Comment.class);
commentList.add(comment);
adapter.notifyDataSetChanged();
lastKey = String.valueOf(comment.getTimestamp());
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
if (lastKey != null) {
commentList.clear();
adapter.notifyDataSetChanged();
comments.child(id_post).orderByChild("timestamp").endAt(lastKey).limitToLast(QUERY_LIMIT * page).addChildEventListener(childEventListener);
} else {
comments.child(id_post).orderByChild("timestamp").limitToLast(QUERY_LIMIT).addChildEventListener(childEventListener);
}
}
最佳答案
您可以添加一个值事件侦听器以限制要接收的结果数,这是firebase-ui中的一个简单示例
ref.limitToLast(5).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
for (DataSnapshot msgSnapshot: snapshot.getChildren()) {
Chat msg = msgSnapshot.getValue(Chat.class);
Log.i("Chat", chat.getName()+": "+chat.getText());
}
}
使用方法limitToLast(5)获取最后添加的5个对象。关于此的其他方法包括limitToFirst(),limitToLast(),startAt(),endAt()和equalTo()
可以在Here中找到更多信息。