【问题标题】:Despite having values in Database, Debugger shows null value in Android Studio尽管数据库中有值,但调试器在 Android Studio 中显示空值
【发布时间】:2020-05-25 09:54:57
【问题描述】:

如您所见,我的数据库中有数据,userIdprofilePhotoUrl 有值,但在我的调试器中,它显示为 null,如下图所示。谁能告诉我为什么会这样?

这是代码,您可以在调试器中看到用户名和电话号码,但 userId 和 profilephoto 值为 null

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());
    Picasso.get().load(profileInfo.getProfilePhotoUrl()).
            centerCrop().
            into(holder.profileImage);
    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());
            context.startActivity(intent);
        }
    });
}

@Override
public int getItemCount() {
    return minfo.size();
}

static class ViewHolder extends RecyclerView.ViewHolder {

    TextView username;
    TextView phoneNumber;
    CircleImageView profileImage;
    RelativeLayout relativeLayout;

    ViewHolder(@NonNull View itemView) {
        super(itemView);
        username = itemView.findViewById(R.id.user);
        phoneNumber = itemView.findViewById(R.id.phone);
        profileImage = itemView.findViewById(R.id.circleProfileImage);
        relativeLayout = itemView.findViewById(R.id.relativeLayout);

    }
}
}

这是我试图从数据库中获取数据的代码。

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_message_layout);

    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) {

        }
    });
}

ProfileInfo 类代码

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;
}
}

【问题讨论】:

  • "谁能告诉我为什么会这样?" - 可能很多人都可以提供帮助,您的问题中的相关代码。
  • @MarkKeen 我已添加代码,请查看。
  • @HarshAshra 我认为您的适配器代码看起来不错,但这不是您从数据库中获取值的地方。您应该发布数据库获取的代码。在这里,只要 minfo 输入正确,就会显示你的结果。
  • @bengongon97 我已经添加了要获取数据的代码。
  • 如果你尝试在onDataChange()里面使用Log.d("TAG", infogetProfilePhotoUrl()),是不是在logcat中打印出来了?

标签: android android-studio debugging firebase-realtime-database


【解决方案1】:

假设receiverID 是正确的,试试这样:

db.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        //the data
        String userName = dataSnapshot.child("userName").getValue(String.class);
        String profilePhotoUrl = dataSnapshot.child("profilePhotoUrl").getValue(String.class);

        //set the data
        username.setText(userName);
        Glide.with(MessageLayout.this).load(profilePhotoUrl).into(profileImage);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
});

更新:

我认为您的 receiverID 变量为空,请确保您按意图正确传递它。尝试记录它并查看它是否为空。

【讨论】:

  • 问题是它为 userID 和 profilephotoUrl 抛出空值,但在我的数据库中我对这两个都有价值。
  • 你试过我的方法了吗。
  • db = FirebaseDatabase.getInstance().getReference().child("UserInfo").child(recieverId);这是我得到错误的地方。代码直到 addValueEventListener 才会到达,因为它会在到达您的代码之前引发错误。
  • 看看你初始化UsersAdapter的代码
猜你喜欢
  • 2023-03-06
  • 2020-10-01
  • 2016-08-10
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
相关资源
最近更新 更多