如何对Firebase Recyclerview进行分页

时间:2016-07-29 07:41:19

标签: android firebase android-recyclerview

我开始使用firebase,一切看起来都不错,但我在recyclerview内显示了50k记录,我无法弄清楚如何分页或类似因为一次加载所有内容花了太多时间。 我使用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);
        }
    }

2 个答案:

答案 0 :(得分:1)

您可以添加值事件侦听器来限制您希望接收的结果数量,这是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

答案 1 :(得分:0)

我正在使用此方法显示实时数据库中存储的8百万条记录,每次分页50条。

private void getUsers(String nodeId) {
    Query query;

    if (nodeId == null)
        query = FirebaseDatabase.getInstance().getReference()
                .child(Consts.FIREBASE_DATABASE_LOCATION_USERS)
                .orderByKey()
                .limitToFirst(mPostsPerPage);
    else
        query = FirebaseDatabase.getInstance().getReference()
                .child(Consts.FIREBASE_DATABASE_LOCATION_USERS)
                .orderByKey()
                .startAt(nodeId)
                .limitToFirst(mPostsPerPage);

    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            UserModel user;
            List<UserModel> userModels = new ArrayList<>();
            for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) {
                userModels.add(userSnapshot.getValue(UserModel.class));
            }

            mAdapter.addAll(userModels);
            mIsLoading = false;
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            mIsLoading = false;
        }
    });
}

您也不必单独存储最后一个密钥。

如果您无法完全理解,那么您可以read the blog post here which explains everything