我正在構建一個聊天應用程式。
我正在嘗試將來自 Firebase Firestore 的訊息顯示到 RecyclerView。
問題是,在我的配接器中,只有建構式執行。
這是我的聊天活動:
public class ChatActivity extends AppCompatActivity {
public RecyclerView recyclerView;
public ChatAdapter chatAdapter;
public ArrayList<MessageChat> allMessages;
public String userID;
public FirebaseFirestore db;
public MessageChat message;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
userID = FirebaseAuth.getInstance().getUid();
Intent intent = getIntent();
Bundle b = intent.getExtras();
recyclerView = findViewById(R.id.recyclerViewChatMessages);
recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
displayMessages(b.getString("matchID"));
}
public void displayMessages(String matchID) {
db = FirebaseFirestore.getInstance();
allMessages = new ArrayList<>();
db.collection("messages")
.whereIn("receiverUserID", Arrays.asList(userID, matchID))
.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot value,
@Nullable FirebaseFirestoreException e) {
if (e != null) {
return;
}
allMessages.clear();
for (QueryDocumentSnapshot document : value) {
message = new MessageChat();
if (document.getString("senderUserID").equals(userID) || document.getString("senderUserID").equals(matchID)) {
message.content = document.getString("content");
message.date = (long) document.get("date");
message.receiverUserID = document.getString("receiverUserID");
message.senderUserID = document.getString("senderUserID");
allMessages.add(message);
}
} //here with debug I see that my messages are added into the list
chatAdapter = new ChatAdapter(getApplicationContext(), allMessages, userID);
recyclerView.setAdapter(chatAdapter);
}
});
}
}
還有我的聊天配接器
public class ChatAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context currentContext;
private ArrayList<MessageChat> listOfMessages;
private String userID;
private static final int LAYOUT_SENT = 1;
private static final int LAYOUT_RECEIVED = 0;
public ChatAdapter(Context cContext, ArrayList<MessageChat> cMessages, String cID) {
this.currentContext = cContext;
this.listOfMessages = cMessages;
this.userID = cID;
// only this constructor is called, not the methods bellow
}
@Override
public int getItemViewType(int position){
Log.d("testiii", "get item view type");
if (listOfMessages.get(position).senderUserID.equals(userID)){
return LAYOUT_SENT;
}
else {
return LAYOUT_RECEIVED;
}
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == LAYOUT_SENT){
View view = LayoutInflater.from(currentContext).inflate(R.layout.message_item_sent, parent, false);
return new ChatAdapter.SenderMessageViewHolder(view);
}
else {
View view = LayoutInflater.from(currentContext).inflate(R.layout.message_item_received, parent, false);
return new ChatAdapter.ReceiverMessageViewHolder(view);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (getItemViewType(position) == LAYOUT_SENT){
((SenderMessageViewHolder) holder).sentMessage.setText(listOfMessages.get(position).content);
}
else {
((ReceiverMessageViewHolder) holder).receivedMessage.setText(listOfMessages.get(position).content);
}
}
@Override
public int getItemCount() {
return listOfMessages.size();
}
public static class SenderMessageViewHolder extends RecyclerView.ViewHolder {
public TextView sentMessage;
public TextView sentDate;
public SenderMessageViewHolder(@NonNull View itemView) {
super(itemView);
sentMessage = itemView.findViewById(R.id.textViewSentMessage);
sentDate = itemView.findViewById(R.id.textViewSentDate);
}
}
public static class ReceiverMessageViewHolder extends RecyclerView.ViewHolder {
public TextView receivedMessage;
public TextView receivedDate;
public ReceiverMessageViewHolder(@NonNull View itemView) {
super(itemView);
receivedMessage = itemView.findViewById(R.id.textViewReceivedMessage);
receivedDate = itemView.findViewById(R.id.textViewReceivedDate);
}
}
}
當我呼叫 displayMessages 時,我的訊息已正確添加到串列中,但我無法顯示它們。
你知道如何讓 RecyclerView 作業嗎?
uj5u.com熱心網友回復:
嘗試打電話chatAdapter.notifyDataSetChanged()后recyclerView.setAdapter(chatAdapter);
uj5u.com熱心網友回復:
實際上,在您的 ChatActivity 中,訊息串列正在傳遞給配接器,但您實際上并未將串列設定為布局管理器。嘗試使用 LinearLayoutManager 來顯示訊息。
https://developer.android.com/reference/androidx/recyclerview/widget/LinearLayoutManager?authuser=1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/415658.html
標籤:
