限制从 Firebase 获取数据以执行拉动刷新和加载更多功能

Get the data from the Firebase in limit to perform pull to refresh and load more functionality

但是现在我正在从 FireBase 中获取所有数据 time.What 我想在 LIMITS 中获取数据,例如 15 一次记录。就像第一次用户从 Firebase 获取 15 条记录时,当用户在屏幕的 bottom/TOP 加载更多数据时,应该从 Firebase 获取更多的 15 条记录并添加到 [=列表的 50=]。

我已经实现了从 Firebase 获取数据库顶部或底部的 15 条记录的逻辑,如下所示:-

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 上搜索过,但没有得到预期的结果,低于我搜索过的 link

1.
2. Second Link
3.Third Link
4. Forth Link

请看图片中我的 firebase 数据结构。

我已经实现了第一次获取 15 或 10 条记录的逻辑并且它有效..并且还实现了加载限制中更多记录的逻辑但是 不正确解决方案(不工作),请帮助并让我知道我哪里做错了..谢谢 :)

编辑解决方案

:- 我已经在此 link 上实现了加载更多或拉取刷新功能:-

你不见了orderByKey()。对于任何过滤查询,您必须使用排序函数。参考documentation

在您的 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 条新记录。

确保保存新检索数据中最旧的键,以便下次刷新时仅检索来自该键的新数据。

建议:不用添加子值监听器来查找最后一个键,您可以只使用值监听器并获取最后一个数据快照,其大小为获取最后一个记录的密钥。

重组您的数据库,设置一个新的子 ID,它是递增的,例如 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);

注意:在列表中加载新内容,您必须注意使用适配器。