1

Dans cette application de chat, j'utilise FirebaseIndexRecyclerAdapter et je veux charger 20 articles sur 20. Le début, je mis keyReg:Charger 20 par 20 éléments avec FirebaseIndexRecyclerAdapter

keyRef=mFirebaseDatabaseReference 
     .child("messagesKeys") 
     .child(usernameFromEmail(mFirebaseUser.getEmail())) 
     .child(room_type_1) 
     .limitToFirst(20); 

je me lastMessageId:

keyRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      for (DataSnapshot child : dataSnapshot.getChildren()) { 

        oldestPostId = child.getKey(); 
       } 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

et je commence FirebaseIndexRecyclerAdapter:

mFirebaseAdapter = new FirebaseIndexRecyclerAdapter<FriendlyMessage,MessageViewHolder>(
      FriendlyMessage.class, 
      R.layout.item_message, 
      MessageViewHolder.class, 
      keyRef, 
      mFirebaseDatabaseReference.child("messages").child(room)) {...} 

dans la méthode isScrollCompleted() (en recyclerview.addOnScrollListener), je Je fais ceci:

private void isScrollCompleted() { 
    if (totalItem - currentFirstVisibleItem == currentVisibleItemCount 
     && this.currentScrollState == SCROLL_STATE_IDLE) { 
      keyRef=mFirebaseDatabaseReference 
        .child("messagesKeys") 
        .child(usernameFromEmail(mFirebaseUser.getEmail())) 
        .child(room_type_1) 
        .orderByKey() 
        .startAt(oldestPostId) 
        .limitToFirst(limit); 



      mFirebaseAdapter.notifyDataSetChanged(); 


      keyRef.addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        boolean is=true; 
        for (DataSnapshot child : dataSnapshot.getChildren()) { 

         oldestPostId = child.getKey(); 

        } 

       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 
    } 

Donc, je veux à chaque fois que le défilement est terminé, faites un nouveau keyRef, actualisez firebaseIndexAdapter, et affichez les 20 messages suivants, mais cela ne fonctionne pas! Après avoir créé le nouveau keyRef et actualisé en utilisant mFirebaseAdapter.notifyDataSetChanged(), aucun nouveau message et les vingt premiers messages ne disparaissent.

Ma question est de savoir s'il est préférable de charger 20 à 20 éléments à chaque fois à partir de .startAt(oldestPostId), ou de charger 20, puis 40, puis 60 messages? Parce que si je commence à chaque fois de oldestPostId, comment sauvegarder et afficher les vingt derniers messages à nouveau?

Répondre

0

vous évidemment ne pas ajouter les éléments nouvellement chargés d'articles de la RecyclerView.Adapter de manière appropriée ...

String lastOneKey = null; int limit = 20; 

keyRef.orderByKey().limitToFirst(limit).once('value', function(snapshot) { 
    snapshot.forEach(function(childSnapshot) { 

     /* that key needs to be updated in here */ 
     lastOneKey = childSnapshot.getKey(); 
    }); 
}); 

puis dans la méthode isScrollCompleted():

keyRef.orderByKey().startAt(lastKnownKey).limitToFirst(limit).once('value', function(snapshot) { 
    snapshot.forEach(function(childSnapshot) { 

     /* and it needs to be updated in here */ 
     lastOneKey = childSnapshot.getKey(); 
    }); 
}); 

au lieu de découpage l'adaptateur, il faut ajouter un élément, puis notifier le RecyclerView.Adapter sur un élément en cours d'insertion (la position de l'adaptateur, où un nouvel élément est ajouté, est toujours la longueur des éléments déjà existants, donc cet index est basé sur 0) ... On pourrait insérer également une gamme de 20 à la fois - mais mieux commencer simple. Suggérerait même d'ajouter un getter/setter pour la dernière clé au RecyclerView.Adapter.

@voir DataSnapshot.

+0

merci l'homme, mais je ne suis pas si bon dans firebase, je ne sais pas comment utiliser la fonction ... mais mon problème n'est pas comment obtenir lastOneKey, son fonctionnement correctement dans mon code, au début je reçois correctement lastOnekey, et chaque fois que je défile, je reçois correctement LastOnekey des 20 prochains éléments .. mon problème est, lorsque le défilement est terminé, et je fais de nouveau keyRef avec .startAt (lastOnekey), et rafraîchir l'adaptateur, rien ne se passe ... si j'essaye , au lieu de rafraîchir, re activer l'adaptateur, puis apparaît vingt éléments suivants, mais les 20 éléments précédents disparaissent ... pas ajouter de nouveaux messages, mais sont remplacés par de nouveaux ... Je veux montrer un nouveau message ci-dessous ... – bojan

+0

si il est même possible de faire avec firebaseindexrecycleradapter? – bojan