我正在使用 Firebase 進(jìn)行聊天活動(dòng)來(lái)存儲(chǔ)消息并RecyclerView顯示它們。根據(jù)下面的適配器構(gòu)造RecyclerView函數(shù),初始化時(shí),從 Cloud Firestore 查詢最后 50 條消息,并按 Unix 時(shí)間戳按降序排列。然后我在我的聊天活動(dòng)中使用 setStackFromEnd(true) 來(lái)翻轉(zhuǎn)它們的顯示順序,因?yàn)樽钚碌南?yīng)該在底部附近,并且使用 messageList.add(0,message) 將新消息添加到適配器的消息列表中這提出了一個(gè)問(wèn)題。在 onBindViewHolder 中,以前可以接受的:Message message = messageList.get(position);holder.message.setText(message.getMessage());holder.author.setText(message.getAuthor() + ":");不再有效,因?yàn)楫?dāng) RecyclerView 加載時(shí),進(jìn)入 RecyclerView 的消息將是最新消息的重復(fù)(位置 0 中的消息)。IE:留言一留言一留言一留言一代替:留言一留言二留言三訊息四其中“消息一”RecyclerView是創(chuàng)建時(shí)的最新消息。將其替換為:Message message = messageList.get(0);holder.message.setText(message.getMessage());holder.author.setText(message.getAuthor() + ":");在onBindViewHolder得到真正的最新消息將讓它出現(xiàn)在屏幕上,但也隨之更換最新消息的所有項(xiàng)目時(shí),則可將其回收。最終,我希望按照新近的順序從下到上查詢消息,同時(shí)繼續(xù)將最新消息放在底部(就像有史以來(lái)的每個(gè)聊天應(yīng)用程序一樣),而不必查詢整個(gè)集合。我應(yīng)該在哪里糾正我的錯(cuò)誤以及如何糾正?適配器構(gòu)造函數(shù):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()); } } } });
1 回答

四季花海
TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
您的代碼中的問(wèn)題是您使用 aUnix timestamp
而不是使用Date
對(duì)象按降序排序。為了使其工作,我建議您更改將時(shí)間戳存儲(chǔ)為日期的方式。為此,請(qǐng)參閱我在這篇文章中的回答,我已經(jīng)解釋了如何使用 aPOJO class
或使用 a來(lái)實(shí)現(xiàn)這一點(diǎn)Map
。
在這里,您可以找到有關(guān)如何創(chuàng)建聊天應(yīng)用程序的教程,我在其中解釋了您正在尋找的完全相同的內(nèi)容。請(qǐng)看下面的截圖:
在我用作查詢的代碼中,以下代碼行:
val query = rootRef!!
.collection("messages")
.document(roomId)
.collection("roomMessages")
.orderBy("sentAt", Query.Direction.ASCENDING)
添加回答
舉報(bào)
0/150
提交
取消