2016-07-29 48 views
2

我開始使用firebase,一切看起來不錯,但我有5萬條記錄在recyclerview內部顯示,我無法弄清楚如何分頁或類似的東西,因爲一次加載所有內容都需要很多時間。 我用childEventListener和FirebaseUI也沒有運氣。如何分頁Firebase Recyclerview

更新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); 
     } 
    } 
+0

您有限制可用於實現分頁的結果的方法:https://www.firebase.com/docs/android/guide/retrieving-data.html –

+0

使用Firebase進行分頁並不容易。它已被[問及覆蓋數十次](http://stackoverflow.com/search?q=%5Bfirebase%5D+pagination)。除非你展示你已經嘗試過的東西以及你具體卡住的地方,否則我認爲這太寬泛了。 –

回答

1

您可以添加一個數據事件偵聽器來限制結果的數量,您希望收到,這裏是從火力的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

0

我正在使用這種方法顯示存儲在實時數據庫中的800萬條記錄,每次有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