Pourtant, maintenant, j'obtiens toutes les données du FireBase
en même temps. Ce que je veux faire, c'est obtenir des données dans [~ # ~] limite [~ # ~] comme 15 enregistre à la fois. Comme pour la première fois, l'utilisateur obtient les 15 enregistrements du Firebase
et lorsque l'utilisateur charge plus de données en bas/en haut de l'écran, plus de 15 enregistrements devraient provenir de Firebase
et ajoutés en bas/HAUT de la liste.
J'ai implémenté la logique pour obtenir les 15 enregistrements en haut OR bas de la base de données de Firebase
comme ci-dessous: -
public class ChatActivity extends AppCompatActivity implements FirebaseAuth.AuthStateListener {
private FirebaseAuth mAuth;
private DatabaseReference mChatRef;
private Query postQuery;
private String newestPostId;
private String oldestPostId;
private int startAt = 0;
private SwipeRefreshLayout swipeRefreshLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
mAuth = FirebaseAuth.getInstance();
mAuth.addAuthStateListener(this);
mChatRef = FirebaseDatabase.getInstance().getReference();
mChatRef = mChatRef.child("chats");
/////GETTING THE VIEW ID OF SWIPE LAYOUT
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
/////GETTING FIRST 10 RECORDS FROM THE FIREBASE HERE
mChatRef.limitToFirst(10).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
oldestPostId = child.getKey();
System.out.println("here si the data==>>" + child.getKey());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
//////FOR THE PULL TO REFRESH CODE IS HERE
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
// Refresh items
System.out.println("Here==>>> "+oldestPostId);
///HERE "oldestPostId" IS THE KEY WHICH I GET THE LAST RECORDS FROM THE FIREBASE
mChatRef.startAt(oldestPostId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
System.out.println("here AFTER data added==>>" + child.getKey());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
});
}
J'ai cherché ici sur SO pour cela, mais je n'ai pas obtenu le résultat attendu, sous le lien que j'ai recherché)
1. Premier lien
2. Deuxième lien
3. troisième lien
4. Forth Link
Veuillez regarder ma structure de données Firebase dans l'image.
J'ai implémenté la logique pour obtenir 15 OR 10 enregistrements à la première fois et cela fonctionne .. et j'ai également implémenté la logique pour charger plus d'enregistrements dans les limites mais n'obtient pas la bonne solution (NE FONCTIONNE PAS), aidez-moi et faites-moi savoir où je me trompe ... Merci :)
: - J'ai implémenté la charge plus ou tirer pour actualiser la fonctionnalité sur ce lien: - Liste de défilement infinie Firebase Afficher 10 éléments en défilement
Il vous manque orderByKey()
. Pour toute requête de filtrage, vous devez utiliser les fonctions de classement. Reportez-vous à la documentation
Dans votre méthode onRefresh
, vous devez définir la limite:
public void onRefresh() {
// Refresh items
///HERE "oldestPostId" IS THE KEY WHICH I GET THE LAST RECORDS FROM THE FIREBASE
mChatRef.orderByKey().startAt(oldestPostId).limitToFirst(10).addListenerForSingleValueEvent(new ValueEventListener() {
.....
Ainsi, les données que vous récupérez sont les 10 seuls nouveaux enregistrements après avoir obtenu vos 10 premiers enregistrements.
Veillez à enregistrer la clé la plus ancienne des données nouvellement récupérées afin que lors de la prochaine actualisation, les nouvelles données de cette clé ne soient récupérées.
Suggestion: Au lieu d'ajouter un écouteur de valeur enfant pour trouver la dernière clé, vous pouvez simplement utiliser l'écouteur de valeur et obtenir le dernier instantané de données avec la taille à obtenir la clé du dernier enregistrement.
restructurer votre base de données, définir un nouvel identifiant enfant qui est incrémentiel comme 0,1,2,3 ... etc
"chats": {
"-KZLKDF": {
"id": 0,
"message": "Hi",
"name":"username"
},
puis faites une méthode pour la requête
public void loadFromFirebase(int startValue,int endValue){
mChatRef.orderByChild(id).startAt(startValue).endAt(endValue).addListenerForSingleValueEvent(this);
}
assurez-vous d'avoir implémenté addListenerForSingleValueEvent puis effectuez la tâche associée à l'adaptateur. Appelez initialement à partir de la méthode onCreate:
loadFromFirebase(0,10);
NB: en chargeant du nouveau contenu dans la liste vous devez être au courant avec l'adaptateur.