【问题标题】:How to get specific user's data when open a card view打开卡片视图时如何获取特定用户的数据
【发布时间】:2020-02-25 13:21:45
【问题描述】:

我根据姓名或电子邮件搜索用户,然后单击该卡片视图。我希望屏幕显示来自 firebase 的用户数据。 如何基于此获取该用户的 ID?我使用了捆绑包,但出现错误。

这是我个人页面的代码。

public class UserSingleActivity extends AppCompatActivity {
    private Button btnsendFriendRequest;
    private TextView displayName,displayEmail,displayId;
    private DatabaseReference mUserDatabase;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_single);

        //.....

        //Here is the error
        String userId=getIntent().getExtras().getString("userId");//look for the user Id

        mUserDatabase= FirebaseDatabase.getInstance().getReference().child("users").child(userId);

        mUserDatabase.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                String display_name=dataSnapshot.child("name").getValue().toString();
                String display_email=dataSnapshot.child("email").getValue().toString();
                displayName.setText(display_name);
                displayEmail.setText(display_email);
            }

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

            }
        });
    }
}

这里是 viewHolder。

public class FriendsViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener {

    private DatabaseReference userDB;
    public TextView name,email,userId;

    public FriendsViewHolders(@NonNull View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);

        name = (TextView)itemView.findViewById(R.id.name);
        email = (TextView)itemView.findViewById(R.id.email);

    }
    @Override
    public void onClick(View v) {
        Intent intent=new Intent(v.getContext(), UserSingleActivity.class);
        v.getContext().startActivity(intent);

    }
}

这是错误。

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
        at com.example.android.myapplication.UserSingleActivity.onCreate(UserSingleActivity.java:29)

【问题讨论】:

  • 如何将userId 添加到Intent

标签: java android firebase firebase-realtime-database


【解决方案1】:

您正在尝试访问以前未保存在捆绑包中的值。 在开始活动之前,您应该使用以下内容:

intent.putExtra("userId", name.getText().toString());

或者代替 name.getText().toString(),您应该输入您将从其他类加载的名称。 这将保存该值,您以后应该可以访问它。

希望对你有帮助!

【讨论】:

  • 我不确定我是否理解正确,但我的 userId 不是名称。我确实尝试输入intent.putExtra("userId", userId.getText().toString());,但由于我不希望屏幕显示 userId,因此我没有为 userId 创建 textView,我在userId.getText() 处收到错误
  • 您正在尝试访问一个名为“userId”的对象,但是,在开始活动之前,您并未将任何名为“userId”的内容添加到意图中。如果你使用intent.putExtra("userId", "This is the id"),你会加载“This is the id”而不是报错
  • 对不起,我有点困惑。 intent.putExtra("userId", "This is the id")我是在 viewHolder 类还是 userSingleActivity 中添加这行代码?我还需要String userId=getIntent().getExtras().getString("userId"); 吗?另外,感谢您的帮助!
  • 在 viewHolder 中,在 Intent intent=new Intent(v.getContext(), UserSingleActivity.class);v.getContext().startActivity(intent); 之间。你仍然需要String userId=getIntent().getExtras().getString("userId");
  • 我这样做了,但后来我收到错误 Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference 的行 String display_name=dataSnapshot.child("name").getValue().toString();
【解决方案2】:
mUserDatabase.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                String display_name=dataSnapshot.child("name").getValue().toString();
                String display_email=dataSnapshot.child("email").getValue().toString();
                displayName.setText(display_name);
                displayEmail.setText(display_email);
            }

当你在做的时候从上面的代码

String display_name=dataSnapshot.child("name").getValue().toString();
                String display_email=dataSnapshot.child("email").getValue().toString();

将此发送到您要显示的其他 classAdapter。

【讨论】:

  • 感谢您的帮助。如何将其发送到适配器?抱歉,我对此很陌生。
  • 向参数化构造函数发送数据... New MyAdapterClass(name,age,jobtitle);
猜你喜欢
  • 2020-08-19
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多