【问题标题】:Firebase database Query StartAt() Not Working?Firebase 数据库查询 StartAt() 不工作?
【发布时间】:2021-04-30 18:46:00
【问题描述】:

所以我一直在尝试对我的 Recyclerview 进行分页,所以每当 recyclerView 到达屏幕底部时,我都会调用 addNewPosts 方法

这里的 lastItemId 是从 firebase 检索到的视图的最后一个 ID。

我检查了它,它不为空,并且给出了屏幕底部的正确节点。

方法

private void addNewPost(String lastItemId) {

    Query ref = FirebaseDatabase.getInstance()
            .getReference("Admin").child(mAuth.getUid()).child("INSTITUTE")
            .child("PROGRAMMES").orderByChild("programmeName");


    ref.startAt(lastItemId).limitToFirst(6).addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

            StyleableToast.makeText(Programme_students.this, "ca", R.style.exampleToast).show();

            // retreiving the data of hte students
            String _icon = snapshot.child("PROGRAMMEINFORMATION").child("programmeIcon").getValue().toString();
            String _programmeName = snapshot.child("PROGRAMMEINFORMATION").child("programmeName").getValue().toString().toUpperCase();
            String _programmeCode = snapshot.child("PROGRAMMEINFORMATION").child("programmeCode").getValue().toString();


            // creating a object of students
            ProgrammeHelper programmeHelperzzz = new
                    ProgrammeHelper(_icon, _programmeName, _programmeCode);

            //adding the stuents to the global variable
            programmesfromdatabase.add(programmeHelperzzz);

            progressBar.setVisibility(View.GONE);

            programme_adapter.notifyDataSetChanged();

            settinglistviewwwwwww();

        }

        @Override
        public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot snapshot) {

        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {

        }
    });

}

所以有一个名为 Stylabletoast 的自定义 toast 只是为了确认我将它保留在那里,因此没有显示 toast 当我保留 StartAt() 函数时没有调用方法

一旦我删除 StartAt(),代码就可以工作,它会为我提供所有新帖子,但它会重复,因为它是从头开始的

【问题讨论】:

    标签: android firebase firebase-realtime-database android-recyclerview


    【解决方案1】:

    因为您在查询中使用了orderByChild("programmeName"),所以startAt() 现在将设置开始的"programmeName" 值,而不是您期望的键(默认排序是orderByKey())。不使用orderByKey()时,第二个参数是key的值。

    因为startAt 包含在内,所以在获取下一个“页面”结果时,您还需要使用startAfter

    将这两个建议放在一起给出:

    ref
      .startAfter(lastItemProgrammeName, lastItemId)
      .limitToFirst(6)
      .addChildEventListener(/* ... */);
    

    【讨论】:

    • 我正在使用 firebase 没有 startAfter ,只有 startAt 和 endAt ,当我使用 startAt 时,它给了我最后一个重复的项目
    猜你喜欢
    • 2016-10-14
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 2018-09-11
    • 2017-07-20
    相关资源
    最近更新 更多