首页 > 解决方案 > 我正在尝试实现firebase分页,但不断添加最后一个孩子两次

问题描述

当用户滚动到最后一个位置时,我调用此方法,但方法添加最后一个孩子两次,例如如果我有 "a,b,c,d,e" ,用户将看到 "a,b,b,c, d,d,e,e,e,e,e.......”我尝试了每个教程,每个人都这样做。

 void getAllNotification(String lastKey){
        Query query;
        if(lastKey==null){
            query=FirebaseDatabase.getInstance().getReference().child("test").orderByKey().limitToFirst(2);
        }else {
            query=FirebaseDatabase.getInstance().getReference().child("test").orderByKey().startAt(lastKey).limitToFirst(2);
        }
        query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                for (DataSnapshot snapshot:dataSnapshot.getChildren()){
                    arrayList.add(snapshot);
                    this.lastKey=snapshot.getKey();
                    Log.d("Notification", "onDataChange: "+snapshot.toString());
                }
                notificationAdapter.notifyDataSetChanged();
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) { }
        });
    }

标签: androidfirebasefirebase-realtime-database

解决方案


使用 时,返回的结果中包含startAt(key)for 的值。key因为我们正在使用orderByKey()并且每个键都是唯一的,所以要在 的值之后“开始” key,您可以在其上附加一个空格。这是因为键是按字典顺序排序的,并且空格 character\u0020是键名称中允许的具有最低 unicode 代码点的字符。不允许使用字符 0-31 ( \u0000- \u001F) 。Cloud Firestore 的引入使这一点更加直观。startAfter()

因此,要将此更改应用于您的代码,您可以使用:

void getAllNotification(String lastKey){
    Query query = FirebaseDatabase.getInstance().getReference().child("test").orderByKey().limitToFirst(2);

    if (lastKey != null) {
      query = query.startAt(lastKey + " "); // start at lastKey, but exclude it from results (because of orderByKey())
    }

    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.hasChildren()) {
              // handle no data or no more data
              return;
            }

            for (DataSnapshot snapshot:dataSnapshot.getChildren()){
                arrayList.add(snapshot);
                this.lastKey=snapshot.getKey(); // ??
                Log.d("Notification", "onDataChange - new data: "+snapshot.toString());
            }

            notificationAdapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
          // TODO: Log errors
        }
    });
}

在您的onDataChange处理程序中,您使用this.lastKey=snapshot.getKey();this表示不清楚的内容,因此我建议将其更改为component/parent或其他使其更清晰的内容。


推荐阅读