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

标签 android firebase firebase-realtime-database firebase-storage

但现在我一次从 FireBase 获取所有数据。我想做的是在 LIMITS 内获取数据,例如 15 一次记录。就像第一次用户从 Firebase 获取 15 条记录时,当用户在屏幕底部/顶部加载更多数据时,应该从 Firebase 获取并添加更多的 15 条记录到列表的底部/顶部。

我已经实现了从 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 上搜索过,但没有得到预期的结果,在我搜索过的链接下方

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

请在图像中查看我的 firebase 数据结构。
Data of firebase

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

编辑解决方案

:- 我已经在此链接上实现了加载更多或拉取刷新功能:- Firebase infinite scroll list view Load 10 items on Scrolling

最佳答案

您缺少 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 条新记录。

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

建议:无需添加子值监听器来查找最后一个键,您可以只使用值监听器并获取具有大小的最后数据快照以获取最后一条记录的键。

关于android - 限制从 Firebase 获取数据以执行拉动刷新和加载更多功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42502024/

相关文章:

android - 如何为 TestClasses 中的 Activity 变量赋值

Travis 上的 Firebase 部署错误

firebase - 从 firebase 恢复意外删除的数据(不是整个项目或数据库)

swift - 当将值更改为从 firebase 中提取的数据时,变量将恢复为初始值。怎样才能让值(value)留下来?

java - ML Kit Vision - 使用内存图像中的camerax进行条形码检测会导致由于 'int android.graphics.Bitmap.getWidth()'而导致空指针异常

javascript - firebase 中数据设计的最佳实践

android - 从android发送文件到nodejs时req.files未定义

android - map 版本 V1 在 Android 10 中崩溃

java - ExifInterface : Skip the tag entry since tag number is not defined, 压缩图片时

android - 在 Android 上过滤 Firebase 数据库 DataSnapshot 子级