Java 调试器显示空值,尽管Firebase数据库中有值
我试图通过intent发送一个值,但我的应用程序崩溃了。因此,我尝试检查调试器中的值,它显示为null。这是图片 正如您所看到的,它显示了Java 调试器显示空值,尽管Firebase数据库中有值,java,android,android-studio,debugging,firebase-realtime-database,Java,Android,Android Studio,Debugging,Firebase Realtime Database,我试图通过intent发送一个值,但我的应用程序崩溃了。因此,我尝试检查调试器中的值,它显示为null。这是图片 正如您所看到的,它显示了userId=“null”和profilephotoURl=“null”为什么会发生这种情况? 这是数据库的图像 这是密码 ProfileInfo.class public class ProfileInfo { String userName, profilePhotoUrl, phoneNumber, userId; public ProfileI
userId=“null”
和profilephotoURl=“null”
为什么会发生这种情况?
这是数据库的图像
这是密码
ProfileInfo.class
public class ProfileInfo {
String userName, profilePhotoUrl, phoneNumber, userId;
public ProfileInfo() {}
public ProfileInfo(String userName, String profilePhotoUrl, String phoneNumber, String userId) {
this.userName = userName;
this.profilePhotoUrl = profilePhotoUrl;
this.phoneNumber = phoneNumber;
this.userId = userId;
}
public ProfileInfo(String userName, String phoneNumber) {
this.userName = userName;
this.phoneNumber = phoneNumber;
}
public String getUserId() {
return userId;
}
public String getPhoneNumber() {
return phoneNumber;
}
public String getUserName() {
return userName;
}
public String getProfilePhotoUrl() {
return profilePhotoUrl;
}
public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.ViewHolder> {
private ArrayList<ProfileInfo> minfo;
public static final String USER_ID = "userid";
Context context;
public UsersAdapter(Context context, ArrayList<ProfileInfo> minfo) {
this.context = context;
this.minfo = minfo;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.user_item, parent, false);
RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
view.setLayoutParams(lp);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
final ProfileInfo profileInfo = minfo.get(position);
holder.username.setText(profileInfo.getUserName());
holder.phoneNumber.setText(profileInfo.getPhoneNumber());
holder.id.setText(profileInfo.getUserId());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context, MessageLayout.class);
intent.putExtra(USER_ID, profileInfo.getUserId());
Log.d("UserID:", profileInfo.getUserId());
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return minfo.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
TextView username;
TextView phoneNumber, id;
CircleImageView profileImage;
RelativeLayout relativeLayout;
ViewHolder(@NonNull View itemView) {
super(itemView);
username = itemView.findViewById(R.id.user);
phoneNumber = itemView.findViewById(R.id.phone);
id = itemView.findViewById(R.id.id);
profileImage = itemView.findViewById(R.id.circleProfileImage);
relativeLayout = itemView.findViewById(R.id.relativeLayout);
}
}
}
public class MessageLayout extends AppCompatActivity {
FirebaseUser currentUser;
DatabaseReference db, chatDb;
EditText message;
ImageButton sendMessage;
TextView username;
CircleImageView profileImage;
String recieverId, messageText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_message_layout);
message = findViewById(R.id.editTextMessage);
sendMessage = findViewById(R.id.sendMessage);
username = findViewById(R.id.displayUsername);
profileImage = findViewById(R.id.circledp);
currentUser = FirebaseAuth.getInstance().getCurrentUser();
Intent intent = getIntent();
recieverId = intent.getStringExtra(UsersAdapter.USER_ID);
db = FirebaseDatabase.getInstance().getReference().child("UserInfo").child(recieverId);
chatDb = FirebaseDatabase.getInstance().getReference().child("Chats");
db.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
ProfileInfo info = dataSnapshot.getValue(ProfileInfo.class);
username.setText(info.getUserName());
Glide.with(MessageLayout.this).load(info.getProfilePhotoUrl()).into(profileImage);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
UserAdapter.class
public class ProfileInfo {
String userName, profilePhotoUrl, phoneNumber, userId;
public ProfileInfo() {}
public ProfileInfo(String userName, String profilePhotoUrl, String phoneNumber, String userId) {
this.userName = userName;
this.profilePhotoUrl = profilePhotoUrl;
this.phoneNumber = phoneNumber;
this.userId = userId;
}
public ProfileInfo(String userName, String phoneNumber) {
this.userName = userName;
this.phoneNumber = phoneNumber;
}
public String getUserId() {
return userId;
}
public String getPhoneNumber() {
return phoneNumber;
}
public String getUserName() {
return userName;
}
public String getProfilePhotoUrl() {
return profilePhotoUrl;
}
public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.ViewHolder> {
private ArrayList<ProfileInfo> minfo;
public static final String USER_ID = "userid";
Context context;
public UsersAdapter(Context context, ArrayList<ProfileInfo> minfo) {
this.context = context;
this.minfo = minfo;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.user_item, parent, false);
RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
view.setLayoutParams(lp);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
final ProfileInfo profileInfo = minfo.get(position);
holder.username.setText(profileInfo.getUserName());
holder.phoneNumber.setText(profileInfo.getPhoneNumber());
holder.id.setText(profileInfo.getUserId());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context, MessageLayout.class);
intent.putExtra(USER_ID, profileInfo.getUserId());
Log.d("UserID:", profileInfo.getUserId());
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return minfo.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
TextView username;
TextView phoneNumber, id;
CircleImageView profileImage;
RelativeLayout relativeLayout;
ViewHolder(@NonNull View itemView) {
super(itemView);
username = itemView.findViewById(R.id.user);
phoneNumber = itemView.findViewById(R.id.phone);
id = itemView.findViewById(R.id.id);
profileImage = itemView.findViewById(R.id.circleProfileImage);
relativeLayout = itemView.findViewById(R.id.relativeLayout);
}
}
}
public class MessageLayout extends AppCompatActivity {
FirebaseUser currentUser;
DatabaseReference db, chatDb;
EditText message;
ImageButton sendMessage;
TextView username;
CircleImageView profileImage;
String recieverId, messageText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_message_layout);
message = findViewById(R.id.editTextMessage);
sendMessage = findViewById(R.id.sendMessage);
username = findViewById(R.id.displayUsername);
profileImage = findViewById(R.id.circledp);
currentUser = FirebaseAuth.getInstance().getCurrentUser();
Intent intent = getIntent();
recieverId = intent.getStringExtra(UsersAdapter.USER_ID);
db = FirebaseDatabase.getInstance().getReference().child("UserInfo").child(recieverId);
chatDb = FirebaseDatabase.getInstance().getReference().child("Chats");
db.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
ProfileInfo info = dataSnapshot.getValue(ProfileInfo.class);
username.setText(info.getUserName());
Glide.with(MessageLayout.this).load(info.getProfilePhotoUrl()).into(profileImage);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
在模型类中,应该有一个参数化构造函数。请尝试注释第二个参数化构造函数,看看这是否有帮助。问题出在构造函数中。似乎您的datasnapshot正在使用您的
ProfileInfo(字符串用户名、字符串电话号码)
构造函数进行转换
下面是您可以做的:确保模型类中只有两个构造函数:常规的无参数构造函数和完整的构造函数。大概是这样的:
public ProfileInfo() {}
public ProfileInfo(String userName, String profilePhotoUrl, String phoneNumber, String userId) {
this.userName = userName;
this.profilePhotoUrl = profilePhotoUrl;
this.phoneNumber = phoneNumber;
this.userId = userId;
}
然后,运行您的代码并重试。在哪一行代码中获取这些空值?@AlexMamo在UserAdapter.class中,当我试图通过InputHanks发送值以征求您的建议时。但是我想知道,如果我必须使用带有用户名和电话号码的构造函数,我应该怎么做?我应该将其他值传递为null吗?将其他值传递为null很酷,但是如果您对任何null变量执行任何get()操作,您的应用程序都有崩溃的风险。更好的方法是在它们为null时为它们设置默认值。例如,“还没有设置”。我相信应该有比这更好的方法,但这是我目前能想到的最好的方法。。。另外,它保证能工作。谢谢你的建议。我一定要去尝尝。