在这个聊天应用中,我正在使用FirebaseIndexRecyclerAdapter
,我希望加载20个消息项目。一开始,我设置keyReg
:
keyRef=mFirebaseDatabaseReference
.child("messagesKeys")
.child(usernameFromEmail(mFirebaseUser.getEmail()))
.child(room_type_1)
.limitToFirst(20);
然后我得到lastMessageId
:
keyRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
oldestPostId = child.getKey();
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
我开始FirebaseIndexRecyclerAdapter
:
mFirebaseAdapter = new FirebaseIndexRecyclerAdapter<FriendlyMessage,MessageViewHolder>(
FriendlyMessage.class,
R.layout.item_message,
MessageViewHolder.class,
keyRef,
mFirebaseDatabaseReference.child("messages").child(room)) {...}
在isScrollCompleted()
方法(在recyclerview.addOnScrollListener中),我这样做:
private void isScrollCompleted() {
if (totalItem - currentFirstVisibleItem == currentVisibleItemCount
&& this.currentScrollState == SCROLL_STATE_IDLE) {
keyRef=mFirebaseDatabaseReference
.child("messagesKeys")
.child(usernameFromEmail(mFirebaseUser.getEmail()))
.child(room_type_1)
.orderByKey()
.startAt(oldestPostId)
.limitToFirst(limit);
mFirebaseAdapter.notifyDataSetChanged();
keyRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
boolean is=true;
for (DataSnapshot child : dataSnapshot.getChildren()) {
oldestPostId = child.getKey();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
所以我希望每次滚动完成后,创建一个新的keyRef
,刷新firebaseIndexAdapter
,并显示接下来的20条消息,但这不起作用!
在我使用keyRef
创建新mFirebaseAdapter.notifyDataSetChanged()
并刷新后,没有新帖子和前20个帖子消失。
我的问题是,每次从.startAt(oldestPostId)
开始加载20个项目,或者加载20个,然后是40个,然后加载60个邮件是否更好?
因为如果我每次都从oldestPostId
开始,那么如何回来并再次显示过去的二十条消息?
答案 0 :(得分:0)
您显然不会以适当的方式将新加载的项目附加到RecyclerView.Adapter
项目中...
String lastOneKey = null; int limit = 20;
keyRef.orderByKey().limitToFirst(limit).once('value', function(snapshot) {
snapshot.forEach(function(childSnapshot) {
/* that key needs to be updated in here */
lastOneKey = childSnapshot.getKey();
});
});
然后在isScrollCompleted()
方法中:
keyRef.orderByKey().startAt(lastKnownKey).limitToFirst(limit).once('value', function(snapshot) {
snapshot.forEach(function(childSnapshot) {
/* and it needs to be updated in here */
lastOneKey = childSnapshot.getKey();
});
});
而不是消隐适配器,必须添加一个项目,然后通知RecyclerView.Adapter
有关正在插入的项目(适配器位置,其中添加了新项目,始终是已经的长度)现有的项目,因此该索引是基于0)...一个也可以一次插入20的范围 - 但更好的开始简单。甚至会建议为RecyclerView.Adapter
的最后一个密钥添加一个getter / setter。
@see DataSnapshot。