Получите данные из Firebase в пределе, чтобы выполнить pull, чтобы обновить и загрузить дополнительную функциональность

Тем не менее, теперь я получаю все данные из FireBase за один раз. Что я хочу сделать, чтобы получать данные в LIMITS, как 15 записей одновременно. Как и в первый раз, пользователь получает 15 записей из Firebase, а когда пользователь загружает больше данных в нижней/верхней части экрана, из Firebase должно поступить еще 15 записей и добавляется в нижнюю/верхнюю часть списка.

Я реализовал логику, чтобы получить 15 записей в верхней или нижней части базы данных из Firebase, как показано ниже: -

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

            }
        });

            }
        });
    }

Я искал его здесь в SO, но не получил ожидаемого результата, по ссылке, по которой я его искал

1. Первая ссылка
2. Вторая ссылка
3. Третья ссылка
4. Четвертая ссылка

Пожалуйста, посмотрите на мою структуру данных Firebase на изображении.
Data of firebase

Я реализовал логику для получения 15 или 10 записей в первый раз, и она работает.. и также реализовала логику для загрузки большего количества записей в пределах, но не получаю правильное решение (НЕ РАБОТАЕТ), пожалуйста, помогите и дайте мне знать, где я делаю неправильно.. Спасибо :)

ОБНОВЛЕНИЕ РЕШЕНИЕ

: - Я реализовал функцию "загрузить больше" или "обновить" по этой ссылке: - Представление списка бесконечной прокрутки Firebase. Загрузка 10 элементов при прокрутке.

Ответ 1

Вам не хватает orderByKey(). Для любых фильтрующих запросов вы должны использовать функции упорядочения. Обратитесь к документации

В вашем методе onRefresh вам нужно установить предел:

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

Таким образом, данные, которые вы извлекаете, являются только 10 новыми записями после того, как вы получили первые 10 записей.

Обязательно сохраните самый старый ключ из вновь полученных данных, чтобы при следующем обновлении извлекались только новые данные из этого ключа.

Предложение: Вместо добавления прослушивателя дочерних значений для поиска последнего ключа вы можете просто использовать прослушиватель значений и получить последний снимок данных с размером, чтобы получить последний ключ записи.

Ответ 2

реструктурируйте свою базу данных, установите новый дочерний идентификатор, который является инкрементным, например 0,1,2,3... и т.д.

"chats": {
"-KZLKDF": {
  "id": 0,
  "message": "Hi",
  "name":"username"
},

затем создайте метод для запроса

public void loadFromFirebase(int startValue,int endValue){

mChatRef.orderByChild(id).startAt(startValue).endAt(endValue).addListenerForSingleValueEvent(this);
}

убедитесь, что вы внедрили addListenerForSingleValueEvent, а затем выполните задачу, связанную с адаптером. Первоначально вызывается метод onCreate:

loadFromFirebase(0,10);

NB: загрузка нового контента в список, который вы должны знать с помощью адаптера.