但是现在我一次从FireBase
获取所有数据。我想做的是在 LIMITS 中获取数据,如 15 记录一时间就像第一次用户从Firebase
获取15条记录一样,当用户在屏幕底部/ TOP加载更多数据时,15条记录应来自Firebase
并添加到底部/ TOP清单。
我已经实现了逻辑,从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 OR 10记录的逻辑并且它可以运行..并且还实现了在极限中加载更多记录的逻辑,但 没有得到正确的解决方案(不工作)< / em> ,请帮忙,让我知道我在哪里做错了。谢谢:)
答案 0 :(得分:8)
您缺少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条新记录。
确保保存新检索数据的最旧密钥,以便下次刷新时只检索此密钥中的新数据。
建议:您可以只使用值侦听器并获取具有大小的最后一个数据快照来获取最后一个记录,而不是添加子值侦听器来查找最后一个键。键。
答案 1 :(得分:3)
重组数据库,设置一个新的子ID,如0,1,2,3 ......等增量的
"chats": {
"-KZLKDF": {
"id": 0,
"message": "Hi",
"name":"username"
},
然后创建一个查询方法
public void loadFromFirebase(int startValue,int endValue){
mChatRef.orderByChild(id).startAt(startValue).endAt(endValue).addListenerForSingleValueEvent(this);
}
确保已实现addListenerForSingleValueEvent然后执行适配器相关任务。 最初从onCreate方法调用:
loadFromFirebase(0,10);
注意:使用适配器在您需要注意的列表中加载新内容。