【发布时间】:2019-03-10 09:58:00
【问题描述】:
我正在使用 Firebase 存储消息并使用 RecyclerView 进行聊天活动来显示它们。根据下面的适配器构造函数,当 RecyclerView 初始化时,会从 Cloud Firestore 查询最后 50 条消息,并按 Unix 时间戳降序排列。然后我在我的聊天活动中使用 setStackFromEnd(true) 来翻转它们的显示顺序,因为最新消息应该靠近底部,并且使用 messageList.add(0,message)
这带来了一个问题。在onBindViewHolder中,之前可以接受的:
Message message = messageList.get(position);
holder.message.setText(message.getMessage());
holder.author.setText(message.getAuthor() + ":");
不再起作用,因为在 RecyclerView 加载时,输入到 RecyclerView 的消息将重复最近的消息(位置 0 的消息)。即:
- 留言一
- 留言一
- 留言一
- 留言一
代替:
- 留言一
- 消息二
- 消息三
- 消息四
其中“消息一”是创建RecyclerView 时的最新消息。将其替换为:
Message message = messageList.get(0);
holder.message.setText(message.getMessage());
holder.author.setText(message.getAuthor() + ":");
在onBindViewHolder 中获取真正的最新消息将其显示在屏幕上,但随后在回收时将所有项目替换为最新消息。最终,我希望将查询的消息按新近的顺序从下到上列出,同时继续将最新消息放在底部(就像每个聊天应用程序一样),而不必查询整个集合。我应该在哪里纠正我的错误以及如何纠正?
适配器构造函数:
public ChatRecyclerViewAdapter(Context mContext, ArrayList<String> mMessage, ArrayList<String> mAuthor, String mRoomID, FirebaseFirestore firestore) {
messageList = new ArrayList<>();
firestore = FirebaseFirestore.getInstance();
mCollection = firestore.collection(mRoomID + "_messages");
Query query = mCollection.orderBy("timestamp", Query.Direction.DESCENDING).limit(50);
query.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
for (DocumentChange documentChange : queryDocumentSnapshots.getDocumentChanges()) {
switch (documentChange.getType()) {
case ADDED:
documentChange.getDocument();
Message message = documentChange.getDocument().toObject(Message.class);
messageList.add(0,message);
notifyItemInserted(messageList.size());
}
}
}
});
尝试在滚动时查询下一组旧消息:
query.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
if (queryDocumentSnapshots.size() > 0) {
//Get the last visible document
DocumentSnapshot lastVisible = queryDocumentSnapshots.getDocuments().get(messageList.size()-1);
//Construct a new query starting at this document and get the next batch of messages
Query next = mCollection.orderBy("timestamp", Query.Direction.DESCENDING).startAfter(lastVisible).limit(20);
next.get();
}
}
});
【问题讨论】:
标签: java android firebase android-recyclerview google-cloud-firestore