1

In dieser Chat-App verwende ich FirebaseIndexRecyclerAdapter und ich möchte 20 von 20 Nachrichtenelemente laden. Am Anfang, habe ich keyReg:Load 20 by 20 Elemente mit FirebaseIndexRecyclerAdapter

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

dann bekomme ich 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) { 

     } 
    }); 

und ich beginne FirebaseIndexRecyclerAdapter:

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

in isScrollCompleted() Methode (in recyclerview.addOnScrollListener), I‘ m dabei:

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) { 

       } 
      }); 
    } 

Also ich will jedes Mal, nachdem Scroll abgeschlossen ist, machen Sie eine neue keyRef, aktualisieren Sie firebaseIndexAdapter, und zeigen Sie die nächsten 20 Nachrichten, aber das funktioniert nicht! Nachdem ich die neue keyRef mache und unter Verwendung mFirebaseAdapter.notifyDataSetChanged() aktualisieren, keine neuen Beiträge und die ersten zwanzig Beiträge verschwinden.

Meine Frage ist, ob es besser ist, 20 von 20 Elemente jedes Mal zu laden, beginnend mit .startAt(oldestPostId), oder laden 20, dann 40, dann 60 Nachrichten? Weil, wenn ich jedes Mal von oldestPostId starte, wie zwanzig Nachrichten zurück und wieder zu zeigen?

Antwort

0

Sie offensichtlich anhängen nicht die neu auf die RecyclerView.Adapter geladen Artikel ‚s Artikel in angemessener Weise ...

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

und dann in der isScrollCompleted() Methode:

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

statt Ausblendung der Adapter, man muss ein Element hinzufügen und dann die RecyclerView.Adapter über ein eingefügtes Element benachrichtigen (die Adapterposition, wo ein neues Element hinzugefügt wird, ist immer die Länge der bereits vorhandenen Elemente, daher ist der Index 0 basierend) ... einer könnte fügen Sie auch einen Bereich von 20 auf einmal ein - aber fangen Sie besser einfach an. Würde sogar vorschlagen, einen Getter/Setter für den letzten Schlüssel zum RecyclerView.Adapter hinzuzufügen.

@see DataSnapshot.

+0

Danke Mann, aber ich bin nicht so gut in Firebase, ich nicht jetzt, wie man Funktion verwendet ... aber mein Problem ist nicht, wie lastOneKey, seine Arbeit richtig in meinem Code, beim Start bekomme ich richtig lastOnekey, und jedes Mal, wenn ich scrollte, bekomme ich korrekt lastOnekey der nächsten 20 Elemente .. mein Problem ist, wenn scroll abgeschlossen ist, und ich mache neue keyRef mit .startAt (lastOnekey), und aktualisieren Adapter passiert nichts ... wenn ich es versuche , anstatt zu aktualisieren, wieder zu aktivieren Adapter, dann erscheint nächsten zwanzig Elemente, aber vorherige 20 Elemente verschwindet ... nicht neue Nachrichten anhängen, sondern durch neue ersetzt werden ... Ich möchte eine neue Nachricht unten zeigen ... – bojan

+0

ob Es ist sogar möglich, mit firebaseindexrecycleradapter zu tun? – bojan

Verwandte Themen