我是编码新手,我正在制作一个聊天应用程序,我的聊天消息活动有问题。收到错误 E/回收器视图:未连接适配器



我一直在关注youtube上的一个教程,到目前为止它一直很好。我想我需要重新审视这件事,因为我就是想不通。

它说没有设置适配器,但它看起来对我设置了

这是我的聊天消息活动

package com.example.chatapp2;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.annotation.SuppressLint;
import android.os.Build;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import org.jetbrains.annotations.NotNull;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class ChatMessageActivity extends AppCompatActivity {
private RecyclerView user_chat_recycler;
private EditText user_chat_messageBox;
private ImageButton user_chat_sendBtn;
private Calendar calendar;
private String positionKeyFriend, positionKeyMsg, friendUserName;
private DatabaseReference user_chat_chatMsgRef, user_chat_usernameRef;
private FirebaseDatabase firebaseDatabase;
private FirebaseRecyclerAdapter firebaseRecyclerAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat_message);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
//get friends userID that is passed through fragment
positionKeyFriend = getIntent().getStringExtra("userid");

user_chat_recycler = findViewById(R.id.chat_message_recyclerView);
user_chat_recycler.hasFixedSize();
user_chat_recycler.setLayoutManager(new LinearLayoutManager(getApplicationContext()));

calendar = Calendar.getInstance();
firebaseDatabase = FirebaseDatabase.getInstance();
user_chat_messageBox = findViewById(R.id.chat_message_messageBox);
user_chat_sendBtn = findViewById(R.id.chat_message_sendBtn);

//define database ref for chat msg
user_chat_chatMsgRef = firebaseDatabase.getReference("chats")
.child(FirebaseAuth.getInstance().getCurrentUser().getUid())
.child(positionKeyFriend);

//get name ref of the other user in the database
user_chat_usernameRef = firebaseDatabase.getReference("Registered Users");
//fetch the friends name from the database
user_chat_usernameRef.child(positionKeyFriend)
.child("chFirstName").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull @NotNull DataSnapshot snapshot) {
if (snapshot.exists()){
friendUserName = snapshot.getValue().toString();
//set activity title to the friends username
setTitle(friendUserName);

}
}
@Override
public void onCancelled(@NonNull @NotNull DatabaseError error) {
Toast.makeText(ChatMessageActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show();
}
});
user_chat_sendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String userChatMsg = user_chat_messageBox.getText().toString();
if (userChatMsg.equals("")){
Toast.makeText(ChatMessageActivity.this, "Message is empty", Toast.LENGTH_SHORT).show();
}else {
// get our user name
user_chat_usernameRef.child(FirebaseAuth.getInstance().getCurrentUser().getUid())
.child("chFirstName").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull @NotNull DataSnapshot snapshot) {
if (snapshot.exists()){
String myUserName = snapshot.getValue().toString();
//get current time
DateFormat dateFormat = new SimpleDateFormat("HH:mm");
String time = dateFormat.format(calendar.getTime());
String message = user_chat_messageBox.getText().toString();
SendUser(message, time, myUserName);
Toast.makeText(ChatMessageActivity.this, message + " " + time + " " + myUserName, Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(@NonNull @NotNull DatabaseError error) {
}
});
}
}
});
//retrieve chat by ref
user_chat_chatMsgRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull @NotNull DataSnapshot snapshot) {
if (snapshot.exists()){
RetrieveChatMessage();
}
}
@Override
public void onCancelled(@NonNull @NotNull DatabaseError error) {
Toast.makeText(ChatMessageActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
//back button

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case android.R.id.home:
//kill this activity when back is pressed
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
private void RetrieveChatMessage(){
final FirebaseRecyclerAdapter<sendUserChatRecieveClass, user_chat_ViewHolder> firebaseRecyclerAdapter = new
FirebaseRecyclerAdapter<sendUserChatRecieveClass, user_chat_ViewHolder>
(sendUserChatRecieveClass.class, R.layout.cardview_sentchat, user_chat_ViewHolder.class, user_chat_chatMsgRef) {
@Override
protected void populateViewHolder(user_chat_ViewHolder holder, sendUserChatRecieveClass model, int position) {
positionKeyMsg= model.getUserID();
if (positionKeyMsg.equals(positionKeyFriend)){
holder.ChangeOrientationLeft();
}else {
holder.ChangeOrientationRight();
}
holder.LastMessage(model.getMessage());
holder.userTime(model.getTime());
}
};
user_chat_recycler.setAdapter(firebaseRecyclerAdapter);
}
//send chat message over database
private void SendUser(String message, String time, String myUserName) {
user_chat_messageBox.setText("");
DatabaseReference myFriendLastMessageRef = firebaseDatabase.getReference("last message")
.child(positionKeyFriend).child(FirebaseAuth.getInstance().getCurrentUser().getUid());
DatabaseReference myOwnMsgRef = firebaseDatabase.getReference("last message")
.child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child(positionKeyFriend);

DatabaseReference friendReceiveMsgRef = firebaseDatabase.getReference("chat message")
.child(positionKeyFriend).child(FirebaseAuth.getInstance().getCurrentUser().getUid());
DatabaseReference myReceiveMsgRef = firebaseDatabase.getReference("chat message")
.child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child(positionKeyFriend);
//update my last msg of friend
retrieveChatMessageClass lastMsg = new retrieveChatMessageClass(myUserName, message, time);
myFriendLastMessageRef.setValue(lastMsg).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull @NotNull Exception e) {
Toast.makeText(ChatMessageActivity.this, "Message could not be delivered", Toast.LENGTH_SHORT).show();
}
});
retrieveChatMessageClass myOwnMsg = new retrieveChatMessageClass(friendUserName, message, time);
myOwnMsgRef.setValue(myOwnMsg).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull @NotNull Exception e) {
Toast.makeText(ChatMessageActivity.this, "Message could not be sent", Toast.LENGTH_SHORT).show();
}
});
//update friends received message
sendUserChatRecieveClass friendMsg = new sendUserChatRecieveClass(FirebaseAuth
.getInstance().getCurrentUser().getUid(), message, time);
friendReceiveMsgRef.push().setValue(friendMsg).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull @NotNull Exception e) {
Toast.makeText(ChatMessageActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
//update my received message
sendUserChatRecieveClass myClassMsg = new sendUserChatRecieveClass(FirebaseAuth
.getInstance().getCurrentUser().getUid(), message, time);
myReceiveMsgRef.push().setValue(myClassMsg).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull @NotNull Exception e) {
Toast.makeText(ChatMessageActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
public static class user_chat_ViewHolder extends RecyclerView.ViewHolder{
View myView;
public user_chat_ViewHolder(@NonNull @NotNull View itemView) {
super(itemView);
myView = itemView;
}
public void LastMessage(String Message){
TextView user_chat_sentMessage = myView.findViewById(R.id.sent_chat_message);
user_chat_sentMessage.setText(Message);
Toast.makeText(myView.getContext(), Message, Toast.LENGTH_SHORT).show();
}
public void userTime(String Time){
TextView user_chat_sentTime =myView.findViewById(R.id.sent_chat_time);
user_chat_sentTime.setText(Time);
}
@SuppressLint("NewApi")
public void ChangeOrientationLeft(){
LinearLayout cardView =myView.findViewById(R.id.sent_chat_layout);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT
, FrameLayout.LayoutParams.WRAP_CONTENT);
params.setMarginEnd(100);
cardView.setLayoutParams(params);
cardView.setBackground(ContextCompat.getDrawable(myView.getContext(), R.drawable.layout_bg_white));

}
@SuppressLint("NewApi")
public void ChangeOrientationRight(){
LinearLayout cardView =myView.findViewById(R.id.sent_chat_layout);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT
, FrameLayout.LayoutParams.WRAP_CONTENT);
params.setMarginStart(100);
cardView.setLayoutParams(params);
cardView.setBackground(ContextCompat.getDrawable(myView.getContext(), R.drawable.layout_bg_green));

}
}
}

我知道我设置了适配器,但我想不通。我真的很感激任何帮助。

我想我知道你的问题是什么。

您正在RetrieveChatMessage方法中设置适配器,但是!这种方法永远不会被调用,基本上我的理论是你的验证:

if (snapshot.exists()){
RetrieveChatMessage();
}

从来都不是true,这会阻止您的方法RetrieveChatMessage被调用,这就是为什么您的RecyclerView从未分配适配器的原因。

请在ValueEventListener的回调onDataChange中调试代码,并查看snapshot.exists((是否为true,以确保并告知我们:(

最新更新