2016-07-29 13 views
2

firebaseを使い始めるとすばらしいですが、recyclerviewの中に50kレコードが表示されています。一度にすべてを読み込むので、ページ付けをする方法などは分かりませんたくさんの時間。 私は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

あなたが受け取りたい結果の数を制限するために、値のイベントリスナーを追加することができ、ここで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を参照してください。

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です。

関連する問題