【发布时间】:2021-07-30 07:51:54
【问题描述】:
我昨天问过这个问题,但运气不好,我想我会重新问一个更清晰的轮廓来说明我正在尝试做什么..
我有一个 RecyclerViewAdapter/View 可以找到 Uid,如果用户在他们的“帐户”上列出了狗,那么它将显示狗列表,在这种情况下是 finn 和 moo,这部分是我的第一项活动 - ChooseDog。每只狗都是可点击的,点击后,它将带您进入第二个活动 - DogProfile - 我将在其中显示每只特定狗的详细信息。
我的问题是配置文件只是随机挑选一只狗(如果有不止一只)并显示这些细节,我似乎无法区分结果。
我想使用ChooseDog 的卡片/按钮上显示的名称,通过intent 将其发送到DogProfile,然后使用该名称显示所选狗的正确详细信息。我对此很陌生,但觉得我做的一切都有些正确?任何帮助表示赞赏。在明确声明名称时,我已经能够找到详细信息,但在尝试从卡中检索名称时却没有。
ChooseDog(第一次活动)
TextView dogName;
databaseReference = FirebaseDatabase.getInstance().getReference("user").child(uid).child("dogs");
dogName = findViewById(R.id.dogName);
ItemClickSupport.addTo(recyclerView).setOnItemClickListener(
new ItemClickSupport.OnItemClickListener() {
@Override
public void onItemClicked(RecyclerView recyclerView, int position, View v) {
getDogData();
Intent intent = new Intent(ChooseDog.this, DogProfile.class);
intent.putExtra("name", dogName.getText().toString());
startActivity(intent);
}
}
);
private void getDogData() {
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
String dogName = ds.child("name").getValue(String.class);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.w("TAG", "onCancelled", databaseError.toException());
}
});
}
狗狗档案(第二次活动)
private void getDogData() {
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("user").child(uid).child("dogs");
String dogsName = getIntent().getExtras().getString("name");
Query query = databaseReference.orderByChild("name").equalTo(dogsName);
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
String name = ds.child("name").getValue(String.class);
String dogBreed = ds.child("breed").getValue(String.class);
String dogAge = ds.child("age").getValue(String.class);
String gender = ds.child("gender").getValue(String.class);
String dogWeight = ds.child("weight").getValue(String.class);
String neutered = ds.child("neutered").getValue(String.class);
dogName.setText(name);
breed.setText(dogBreed);
age.setText(dogAge);
dogGender.setText(gender);
weight.setText(dogWeight);
isNeutered.setText(neutered);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.w("TAG", "onCancelled", databaseError.toException());
}
});
}
Logcat
2021-07-29 10:13:49.990 17941-17941/com.example.doggo E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.doggo, PID: 17941
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.widget.TextView.getText()' on a null object reference
at com.example.doggo.ChooseDog$1.onItemClicked(ChooseDog.java:69)
at com.example.doggo.ItemClickSupport$1.onClick(ItemClickSupport.java:16)
at android.view.View.performClick(View.java:8160)
at android.view.View.performClickInternal(View.java:8137)
at android.view.View.access$3700(View.java:888)
at android.view.View$PerformClick.run(View.java:30236)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8512)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1139)
【问题讨论】:
-
您是从文本字段中获取狗名,然后将其发送到下一个活动,还是从数据库中检索狗名并发送?
-
我从数据库中获取狗的名字,将其显示在卡片文本视图(第一个活动)上,基本上我想检查我的第二个活动是否该文本视图与数据库中的名称匹配,显示特定狗的详细信息,希望这有意义@PeterHaddad
-
Frank van Puffelen 的 answer 到底有什么不好的地方?
-
他的回答有效,但它是静态的,我需要动态拉取数据,所以
equalTo("moo")需要从按钮的textView中找到名称。我不知道我是不是盯着它看太久了,或者我把东西放错了地方,但我经常收到NullPointerException,所以绝对不是从正确的地方拉东西。 @AlexMamo -
如果应用程序崩溃,会有一个堆栈跟踪。请在 logcat 上查找,并将其添加到您的问题中。还请说明您在哪一行特定代码处收到 NullPointerException?
标签: java android firebase firebase-realtime-database