android - 我正在尝试实现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) { }
});
}
解决方案
使用 时,返回的结果中包含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
或其他使其更清晰的内容。
推荐阅读
- r - 在 R 中保留日期格式
- sql - 通过 PowerShell ISE 从 SQL Server 更改 Export-CSV 文件中的语言
- ssh - Gcloud SSH 隧道代理始终通过美国,甚至来自其他地区
- javascript - ReactJS - 将道具传递给子组件但无法在子组件中访问它
- python - 无法删除 CSV 中的重复项
- python - 如何在不刷新 Django 页面的情况下将用户名呈现为文本?
- firebase - 从 Firebase 获取数据到 react-native 应用程序
- apache-spark - Azure Cosmos(MongoDB API) - 来自 Spark 的错误
- javascript - Socket.io + node.js - 客户端不接收广播发射
- mysql - MySQL - 检查不存在的记录