2016-07-29 4 views
2

Ich fange an Firebase zu verwenden und alles sieht gut aus, aber ich habe 50k Datensätze in einem recyclerview zu zeigen, und ich kann nicht herausfinden, wie zu paginate oder etwas ähnliches, weil alle gleichzeitig laden viel Zeit. Ich habe childEventListener und FirebaseUI auch ohne Glück verwendet.Wie man ein Firebase Recyclerview paginate

UPDATE 1: Endlich habe ich für das Update 1 gearbeitet, das ist nicht die beste Lösung dafür, aber ich denke, ich werde später einige Änderungen vornehmen.

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

Sie haben Methoden, um Ergebnisse zu begrenzen, die Sie verwenden können, um Seitenumbruch zu implementieren: https://www.firebase.com/docs/android/guide/retrieving-data.html –

+0

Seitenumbruch mit Firebase ist nicht einfach. Es wurde [Dutzende Male vorher gefragt und abgedeckt] (http://stackoverflow.com/search?q=%5Bfirebase%5D+pagination). Wenn Sie nicht zeigen, was Sie versucht haben und wo Sie konkret stecken bleiben, stimme ich Ihnen zu, dass dies zu weit gefasst ist. –

Antwort

1

Sie können einen Wert Ereignis-Listener hinzufügen, um die Anzahl der Ergebnisse begrenzen möchten Sie erhalten möchten, hier ist ein kurzes Beispiel aus Feuerbasis-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()); 
    } 
} 

Verwenden Sie die Methode limitToLast (5) um die letzten 5 Objekte zu erhalten, die hinzugefügt wurden. Andere Methoden in Bezug auf diese umfassen limitToFirst(), limitToLast(), startAt(), endAt() und equalTo() Weitere Informationen finden Sie .

0

Ich verwende diese Methode, um 8 Millionen Datensätze anzuzeigen, die in der Echtzeitdatenbank gespeichert sind, 50 gleichzeitig mit Seitenumbruch.

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; 
     } 
    }); 
} 

Sie müssen den letzten Schlüssel auch nicht separat speichern. Wenn Sie es nicht vollständig verstehen können, dann können Sie read the blog post here which explains everything.