2016-12-21 30 views
5

Próbuję utworzyć aplikację do czatu, używam Firebase jako mojego zaplecza, Zapełniam mój listview onCreate() z ostatnich 10 wysłanych wiadomości, i I wystarczy, że kiedy użytkownik przewinie się w górę^za każdym razem załaduje 10 kolejnych.Firebase, aby załadować więcej przedmiotów na przewijanie (Android)

Mam wszystko działa, problem polega na tym, że baza ogniowa ładuje za każdym razem dane wszystkie i nie zwiększa o 10 istniejących danych.

Na przykład: ładuje 10 wiadomości przy starcie, a kiedy przewijam w górę, ładuje 20 wiadomości, a następnie ładuje 30 wiadomości, zamiast tylko ładować 10 kolejnych naraz.

Jest to kod:

//Listview to find when user is scrolling and reach the top i.e firstVisibleItem == 0 

messagesList.setOnScrollListener(new AbsListView.OnScrollListener() { 
    @Override 
    public void onScrollStateChanged(AbsListView absListView, int i) { 

    } 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, 
     int visibleItemCount, int totalItemCount) { 

     if (firstVisibleItem == 0 && !loading) { 
      msgNum += 10; 
      setMessagesList(msgNum); //your load more function 
     } 
    } 
}); 

//Firebase to load more on scroll code: 
public void setMessagesList(int msgNum) { 

    MessegesRef2 = database.getReference("chatsMessages").child(chatID); 
    messageValueListener = MessegesRef2.orderByChild("creationDate").limitToLast(msgNum).addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      loading = true; 
      for (DataSnapshot data: dataSnapshot.getChildren()) { 

       ChatMessage chatMessage = data.getValue(ChatMessage.class); 

       chatMessageAdapter.add(chatMessage); 
       chatMessageAdapter.notifyDataSetChanged(); 
      } 
      loading = false; 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 
+0

Tworzysz odniesienie do wiadomości za każdym razem, gdy lista się przewija. To jest powód, dla którego aplikacja pobiera wszystkie dane. –

+0

Hej Febi, tak, wiem to. Dlatego pytam, jak można to zrobić za pomocą Firebase? –

+0

Wystarczy zaktualizować zapytanie na przewijanie listy zamiast wielokrotnie tworzyć odniesienia. –

Odpowiedz

3

myślę, że można użyć endAt()

ref.orderByChild("creationDate").limitToLast(pageSize).endAt(oldestLocalMessageTime).addValueEventListener 
// pageSize is the number of messages you want to load each time (10) 
// oldestLocalMessageTime is the time of oldest message that you have loaded from Firebase 
// everytime you load/load more messages you need to update oldestLocalMessageTime value 
+0

Czy mógłbyś mi pomóc w tym samym rodzaju problemu, Moje pytanie na SO jest: - http://stackoverflow.com/q/42502024/3946958 –

1

można użyć startAt(), Endat() oraz metodę equalTo(). Gdy użytkownik dojdzie do końca listy, wywołaj metodę ładowania większej ilości danych z serwera. upewnij się, że implementuje ValueEventListener.

Query pagination = mDatabase.orderByChild("id").startAt(startAt).endAt(startAt + 10); 
pagination.addListenerForSingleValueEvent(this); 
+0

To jest kod JavaScript, pytanie jest w Javie (Android) – koceeng

+1

Mam edytował odpowiedź dla Androida. Dzięki –

+0

@DinIslamMilon Proszę spojrzeć na to pytanie http://stackoverflow.com/q/42502024/3946958 .. Mam ułożone w tym samym problem –