作者:Apollo宫保鸡丁 | 来源:互联网 | 2023-02-10 15:05
然而现在我从FireBase
一次获取所有数据.我想做什么,一次获取LIMITS中的数据,如15条记录.就像在第一次用户从中获取15条记录Firebase
时,当用户在屏幕的底部/顶部加载更多数据时,应该有15条记录来自Firebase
并添加到列表的底部/ TOP.
我已经实现了逻辑,以便从数据库的顶部或底部获取15条记录,Firebase
如下所示: -
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. 第一个链接
2. 第二个链接
3. 第三个链接
4. 第四个链接
请查看我的firebase数据结构.
我已经实现了第一次获取15 OR 10记录的逻辑并且它可以工作..并且还实现了在极限中加载更多记录但没有得到正确解决方案的逻辑(不工作),请帮助并让我知道我在哪里做错了.谢谢:)
1> kirtan403..:
你错过了orderByKey()
.对于任何过滤查询,您必须使用排序函数.请参阅文档
在您的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条新记录.
确保保存新检索数据的最旧密钥,以便在下次刷新时仅检索此密钥的新数据.
建议:您可以只使用值侦听器并获取具有大小的最后一个数据快照来获取最后一个记录的键,而不是添加子值侦听器来查找最后一个键.