【发布时间】:2021-09-29 15:49:09
【问题描述】:
我正在尝试在 android studio 中制作一个聊天应用程序。我已经部分完成了这个项目,但我遇到了这个错误,我无法弄清楚。问题是每当我使用.getMessage() 时,它都会返回一个空值。
代码如下
ChatAdapter.java
import android.content.Context;
import android.hardware.SensorManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.google.firebase.auth.FirebaseAuth;
import java.util.ArrayList;
public class ChatAdapter extends RecyclerView.Adapter{
ArrayList<MessagesModel> messagesModels;
Context context;
int SENDER_VIEW_TYPE = 1;
int RECEIVER_VIEW_TYPE = 2;
public ChatAdapter(ArrayList<MessagesModel> messagesModels, Context context) {
this.messagesModels = messagesModels;
this.context = context;
}
@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 SenverViewHolder(view);
}
else{
View view = LayoutInflater.from(context).inflate(R.layout.sample_sender, parent,false);
return new ReceiverViewHolder(view);
}
}
@Override
public int getItemViewType(int position) {
return SENDER_VIEW_TYPE;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
MessagesModel messagesModel = messagesModels.get(position);
System.out.println(messagesModel.getMessage());
if (holder.getClass() == SenverViewHolder.class){
((SenverViewHolder)holder).senderMsg.setText(messagesModel.getMessage());
}else {
((ReceiverViewHolder)holder).receiverMsg.setText(messagesModel.getMessage());
}
}
@Override
public int getItemCount() {
return messagesModels.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.reciverTime);
}
}
public class SenverViewHolder extends RecyclerView.ViewHolder {
TextView senderMsg, senderTime;
public SenverViewHolder(@NonNull View itemView) {
super(itemView);
senderMsg = itemView.findViewById(R.id.senderText);
senderTime = itemView.findViewById(R.id.senderTime);
}
}
}
MessagesModel.java
public class MessagesModel {
String uId,message;
Long timestamp;
public MessagesModel() {}
public MessagesModel(String uID, String Message) {
super();
this.uId = uID;
this.message = Message;
}
public String getuId() {
return uId;
}
public void setuId(String uId) {
this.uId = uId;
}
public String getMessage() {
System.out.println("Message "+message);
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Long getTimestamp() { return timestamp; }
public void setTimestamp(Long timestamp) {
this.timestamp = timestamp;
}
}
UsersAdapter.java
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.ViewHolder>{
ArrayList<Users> list;
Context context;
public UsersAdapter(ArrayList<Users> list, Context context) {
this.list = list;
this.context = context;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.sample_show_user,parent,false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull UsersAdapter.ViewHolder holder, int position) {
Users users = list.get(position);
Picasso.get().load(users.getProfilepic()).placeholder(R.drawable.ic_baseline_supervised_user_circle_24).into(holder.image);
holder.userName.setText(users.getUsername());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent( context, chatDetailedActivity.class);
intent.putExtra("userId", users.getUserId("user"));
intent.putExtra("profileic", users.getProfilepic());
intent.putExtra("username", users.getUsername());
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
ImageView image;
TextView userName, lastMessage;
public ViewHolder(@NonNull View itemView) {
super(itemView);
image = itemView.findViewById(R.id.profile_image);
userName = itemView.findViewById(R.id.userNameList);
lastMessage = itemView.findViewById(R.id.lestMessage);
}
}
}
ChatDetailedActivity.java
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import com.example.vroo.databinding.ActivityChatDetailedBinding;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
public class chatDetailedActivity extends AppCompatActivity {
ActivityChatDetailedBinding binding;
FirebaseDatabase database;
FirebaseAuth auth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityChatDetailedBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
database = FirebaseDatabase.getInstance();
auth = FirebaseAuth.getInstance();
final String senderId = auth.getUid();
String receiveId = getIntent().getStringExtra("userId");
String username = getIntent().getStringExtra("username");
String profilePic = getIntent().getStringExtra("profileic");
binding.ChatUsername.setText(username);
Picasso.get().load(profilePic).placeholder(R.drawable.ic_baseline_supervised_user_circle_24).into(binding.profileImage);
binding.backArrow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(chatDetailedActivity.this,MainActivity.class);
startActivity(intent);
}
});
final ArrayList<MessagesModel> messagesModel = new ArrayList<>();
final ChatAdapter chatAdapter = new ChatAdapter(messagesModel,this);
binding.RecycleView.setAdapter(chatAdapter);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
binding.RecycleView.setLayoutManager(layoutManager);
final String senderRoom = senderId + receiveId;
final String receiverRoom = receiveId + senderId;
database.getReference().child("chats").child(senderRoom).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
messagesModel.clear();
for(DataSnapshot snapshot1:snapshot.getChildren()){
MessagesModel model = snapshot.getValue(MessagesModel.class);
messagesModel.add(model);
}
chatAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
binding.send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = binding.editTextTextMultiLine.getText().toString();
final MessagesModel model = new MessagesModel(senderId,message);
binding.editTextTextMultiLine.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 文件
{
"User" : {
"7V43IzF3QBh4wtn3NG6gW0xxNR03" : {
"mail" : "gelk@gmail.com",
"password" : "4547777",
"username" : "hello"
},
"PLYNSjgHfpMKZ3M2pVJcH2NqM5h1" : {
"mail" : "neil@gmail.com",
"password" : "123456",
"username" : "neil"
},
"iK6zuVXOSqNLGi75XmXaM16jrxI2" : {
"mail" : "gkjkjkjelk@gmail.com",
"password" : "4547777",
"username" : "hejkllo"
}
},
"chats" : {
"7V43IzF3QBh4wtn3NG6gW0xxNR03PLYNSjgHfpMKZ3M2pVJcH2NqM5h1" : {
"-MfCf3cXc0dsV3YsisbJ" : {
"message" : "hi",
"uId" : "PLYNSjgHfpMKZ3M2pVJcH2NqM5h1"
},
"-MfCfedXfFIvM2bZ3iYe" : {
"message" : "hi",
"uId" : "PLYNSjgHfpMKZ3M2pVJcH2NqM5h1"
},
"-MfCllAO6qaGFI7FD1ud" : {
"message" : "hi"
},
"-MfCnnPUTYUh5OW21fws" : {
"message" : "hi"
}
},
"PLYNSjgHfpMKZ3M2pVJcH2NqM5h17V43IzF3QBh4wtn3NG6gW0xxNR03" : {
"-MfCf3XpXtuQoUx1dKHh" : {
"message" : "hi",
"uId" : "PLYNSjgHfpMKZ3M2pVJcH2NqM5h1"
},
"-MfCfeZ1ehufuG4dctXg" : {
"message" : "hi",
"uId" : "PLYNSjgHfpMKZ3M2pVJcH2NqM5h1"
},
"-MfCll4UCdk24rTpjStb" : {
"message" : "hi"
},
"-MfCnnJafzuCg1ZTrCI1" : {
"message" : "hi"
}
}
}
}
【问题讨论】:
-
请编辑您的问题并将您的数据库结构添加为 JSON 文件。您可以通过单击 Firebase Console 的溢出菜单 (⠇) 中的导出 JSON 来简单地获取它。
-
您是否尝试将
String uId,message;设置为私有? -
然后呢? .getMessage() 是否仍然返回空值?
-
@AlexMamo 是的,当我打印它时它仍然返回空值这是我得到的 I/System.out: Message= null。
-
你在哪一行代码中得到了空值?
标签: java android firebase android-studio