但现在我一次从 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
我已经实现了第一次获取 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/