【发布时间】:2022-01-05 08:26:57
【问题描述】:
我的发送者消息和接收者消息只在发送消息中发送,在接收视图中没有。
我添加了以下代码
database.getReference().child("chats")
.child(senderRoom)
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
messageModels.clear();
for (DataSnapshot snapshot1 : snapshot.getChildren())
{
MessageModel model = snapshot1.getValue(MessageModel.class);
model.setMessageId(snapshot1.getKey());
messageModels.add(model);
}
chatAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
但每次我发送新消息时,应用程序都会给出“应用程序没有响应”的错误
然后,正如我所说,所有发送的消息都出现在发送者视图中,而不是接收者视图中。 这是错误:
E/AndroidRuntime: 致命异常: main 进程:myapp.files.memochatting,PID:23966 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.widget.TextView.setText(java.lang.CharSequence)” 在 myapp.files.memochatting.Adapter.ChatAdapter.onBindViewHolder(ChatAdapter.java:81)
他指的第(81)行是:
viewHolder.senderMsg.setText(messageModel.getMessage());
我的数据库如下所示:
{
"Users" : {
"9tDjCkxCnISIzOS1TvHmGwgFSG93" : {
"email" : "maha@gmail.com",
"password" : "123456789",
"userName" : "maha"
},
"PJFr3Lw0EcWLN275GdOqSDHR76D2" : {
"email" : "asmaa.11@gmail.com",
"password" : "123456789",
"userName" : "Asmaa"
},
"T9oPNFhHVadWySFt0ILA6D6XRRm1" : {
"email" : "ahmed@gmail.com",
"password" : "123456789",
"userName" : "ahmed"
},
"WtO1EJijSfgeF9JsVsMG7ZOSbjP2" : {
"profilePic" : "https://lh3.googleusercontent.com/a-/AOh14GggNZN75jHuTl1ZB5ZuQm26aXbT4DvLFGX1_OE0Kw=s96-c",
"userId" : "WtO1EJijSfgeF9JsVsMG7ZOSbjP2",
"userName" : "Maha Abd El-Moneam"
},
"moTrPYohePOFiX7kSLzOVYdbq1F2" : {
"email" : "mohamed@gmail.com",
"password" : "123456789",
"userName" : "mohamed"
}
},
"chats" : {
"9tDjCkxCnISIzOS1TvHmGwgFSG93PJFr3Lw0EcWLN275GdOqSDHR76D2" : {
"-MsdYoWZISiMbPaCDgLC" : {
"message" : "hello maha, I'm asmaa",
"timestamp" : 1641374739108,
"uId" : "9tDjCkxCnISIzOS1TvHmGwgFSG93"
},
"-Msd_2cuQOPDrU8G7_vS" : {
"message" : "hi asmaa",
"timestamp" : 1641375063018,
"uId" : "9tDjCkxCnISIzOS1TvHmGwgFSG93"
}
},
"9tDjCkxCnISIzOS1TvHmGwgFSG93WtO1EJijSfgeF9JsVsMG7ZOSbjP2" : {
"-MsdIrPbq7PFLRFSD-Pa" : {
"message" : "hellow from me",
"timestamp" : 1641370555853,
"uId" : "WtO1EJijSfgeF9JsVsMG7ZOSbjP2"
},
"-MsdIvG06F3EgjtdTzEY" : {
"message" : "please receive",
"timestamp" : 1641370570841,
"uId" : "WtO1EJijSfgeF9JsVsMG7ZOSbjP2"
},
"-MsdWGk0UBnm0Nch14uG" : {
"message" : "hello",
"timestamp" : 1641374072522,
"uId" : "9tDjCkxCnISIzOS1TvHmGwgFSG93"
},
"-MsdWukKtbmNNE8-lrPu" : {
"message" : "hi maha.gmail",
"timestamp" : 1641374240472,
"uId" : "9tDjCkxCnISIzOS1TvHmGwgFSG93"
}
},
"T9oPNFhHVadWySFt0ILA6D6XRRm1null" : {
"-MsKNncf-SlE2I-hwsj6" : {
"message" : "hello ahmed",
"timestamp" : 1641036308698
}
},
"WtO1EJijSfgeF9JsVsMG7ZOSbjP29tDjCkxCnISIzOS1TvHmGwgFSG93" : {
"-MsdIrEwWMoEep3buSCK" : {
"message" : "hellow from me",
"timestamp" : 1641370555853,
"uId" : "WtO1EJijSfgeF9JsVsMG7ZOSbjP2"
},
"-MsdIuv8E0e74zv_WyY4" : {
"message" : "please receive",
"timestamp" : 1641370570841,
"uId" : "WtO1EJijSfgeF9JsVsMG7ZOSbjP2"
},
"-MsdXVMa8zEt_sB0unfP" : {
"message" : "from maha to mahagmail",
"timestamp" : 1641374394307,
"uId" : "WtO1EJijSfgeF9JsVsMG7ZOSbjP2"
}
},
"WtO1EJijSfgeF9JsVsMG7ZOSbjP2null" : {
"-MsKNk5TBVnuhZikCdSs" : {
"message" : "hi maha",
"timestamp" : 1641036294080
},
"-MsdBScowXAo-Tti8zcM" : {
"message" : "please",
"timestamp" : 1641368615680
}
},
"nullT9oPNFhHVadWySFt0ILA6D6XRRm1" : {
"-MsKNnZQJNBVNdusyFax" : {
"message" : "hello ahmed",
"timestamp" : 1641036308698
}
},
"nullWtO1EJijSfgeF9JsVsMG7ZOSbjP2" : {
"-MsKNk-6YSAToqGxhD9O" : {
"message" : "hi maha",
"timestamp" : 1641036294080
},
"-MsdBSYC9LlNfrcaETS2" : {
"message" : "please",
"timestamp" : 1641368615680
}
}
}
}
public class MessageModel {
String uId, message, messageId;
Long timestamp;
public MessageModel(String uId, String message, Long timestamp) {
this.uId = uId;
this.message = message;
this.timestamp = timestamp;
}
public MessageModel(String uId, String message) {
this.uId = uId;
this.message = message;
}
public MessageModel(){
}
public String getuId() {
return uId;
}
public void setuId(String uId) {
this.uId = uId;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getMessageId() {
return messageId;
}
public void setMessageId(String messageId) {
this.messageId = messageId;
}
public Long getTimestamp() {
return timestamp;
}
public void setTimestamp(Long timestamp) {
this.timestamp = timestamp;
}
}
public class ChatAdapter extends RecyclerView.Adapter {
ArrayList<MessageModel> messageModels;
Context context;
String recId;
int SENDER_VIEW_TYPE = 1;
int RECEIVER_VIEW_TYPE = 2;
public ChatAdapter(ArrayList<MessageModel> messageModels, Context context) {
this.messageModels = messageModels;
this.context = context;
}
public ChatAdapter(ArrayList<MessageModel> messageModels, Context context, String recId) {
this.messageModels = messageModels;
this.context = context;
this.recId = recId;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == SENDER_VIEW_TYPE)
{
View view = LayoutInflater.from(context).inflate(R.layout.sample_sender,parent,false);
return new SenderViewHolder(view);
}
else
{
View view = LayoutInflater.from(context).inflate(R.layout.sample_receiver,parent,false);
return new ReceiverViewHolder(view);
}
}
@Override
public int getItemViewType(int position) {
if(messageModels.get(position).getuId() == (FirebaseAuth.getInstance().getUid()))
{
return SENDER_VIEW_TYPE;
}
else
{
return RECEIVER_VIEW_TYPE;
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
MessageModel messageModel = messageModels.get(position);
if (holder.getClass() == SenderViewHolder.class)
{
SenderViewHolder viewHolder = (SenderViewHolder) holder;
viewHolder.senderMsg.setText(messageModel.getMessage());
}
else
{
ReceiverViewHolder viewHolder = (ReceiverViewHolder) holder;
viewHolder.receiverMsg.setText(messageModel.getMessage());
}
}
@Override
public int getItemCount() {
return messageModels.size();
}
public class ReceiverViewHolder extends RecyclerView.ViewHolder{
TextView receiverMsg, receiverTime;
public ReceiverViewHolder(@NonNull View itemView) {
super(itemView);
receiverMsg = itemView.findViewById(R.id.receiverText);
receiverTime = itemView.findViewById(R.id.receiverTime);
}
}
public class SenderViewHolder extends RecyclerView.ViewHolder{
TextView senderMsg, senderTime;
public SenderViewHolder(@NonNull View itemView) {
super(itemView);
senderMsg = itemView.findViewById(R.id.receiverText);
senderTime = itemView.findViewById(R.id.senderTime);
}
}
}
public class ChatDetailActivity extends AppCompatActivity {
ActivityChatDetailBinding binding;
FirebaseDatabase database;
FirebaseAuth auth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityChatDetailBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
getSupportActionBar().hide();
database = FirebaseDatabase.getInstance();
auth = FirebaseAuth.getInstance();
final String senderId = auth.getUid();
String recieveId = getIntent().getStringExtra("userId");
String userName = getIntent().getStringExtra("userName");
String profilePic = getIntent().getStringExtra("profilePic");
binding.userName.setText(userName);
Picasso.get().load(profilePic).placeholder(R.drawable.ic_avatar).into(binding.profileImage);
binding.backArrow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(ChatDetailActivity.this, MainActivity.class);
startActivity(intent);
}
});
final ArrayList<MessageModel> messageModels = new ArrayList<>();
final ChatAdapter chatAdapter = new ChatAdapter(messageModels,this,recieveId);
binding.chatRecyclerView.setAdapter(chatAdapter);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
binding.chatRecyclerView.setLayoutManager(layoutManager);
final String senderRoom = senderId + recieveId;
final String receiverRoom = recieveId + senderId;
binding.send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String message = binding.enterMessage.getText().toString();
final MessageModel model = new MessageModel(senderId, message);
model.setTimestamp(new Date().getTime());
binding.enterMessage.setText("");
database.getReference().child("chats")
.child(senderRoom)
.push()
.setValue(model).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void unused) {
database.getReference().child("chats")
.child(receiverRoom)
.push()
.setValue(model).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void unused) {
}
});
}
});
}
});
}
}
【问题讨论】:
-
这段代码中到底有什么不符合您的预期?告诉我们共享代码有什么问题。你有什么错误吗?
-
除此之外,请编辑您的问题并将您的数据库结构添加为 JSON 文件。您可以通过单击 Firebase Console 的溢出菜单 (⠇) 中的导出 JSON 来简单地获取它。
-
我编辑了我的问题,请指教。
-
如果应用程序崩溃,会有一个堆栈跟踪。请在 logcat 上查找,并将其添加到您的问题中。不要忘记添加数据库架构。
-
请再次查看我的第二条评论。
标签: java android firebase firebase-realtime-database