我的firebase recyclerview始终仅返回最后一个值。 我想在回收者视图中显示userName,所以我使用了Query。
这是我尝试过的
如果我选择“匈牙利”,请找到TripInfo-Hungary节点并带上用户ID。 接下来,使用来自匈牙利的带来在用户节点中找到。
我想要得到的类似于此sql。 从Tripinfo中选择用户ID,其中country ='Hungary' Tripinfo.userID = User.userID上的内部加入用户。
这是我的代码。
***Firebase realtime DB
tkitaka
ㄴTripInfo
ㄴHungary
ㄴuserID1(D223Hlk5aMf17Su9rB9NeKEaT2c2)
ㄴuserID2(dirrk65x0GTEQ8zlRYZNryqrGYH2)
ㄴuserID2(shngJIzT8ieI1LiQ012peMHH5p13)
ㄴUser
ㄴuserID1(D223Hlk5aMf17Su9rB9NeKEaT2c2)
ㄴuserName: aaa
ㄴuserID2(dirrk65x0GTEQ8zlRYZNryqrGYH2)
ㄴuserName: bbb
ㄴuserID3(shngJIzT8ieI1LiQ012peMHH5p13)
ㄴuserName: ccc
List<User> UserList;
...onCreateView...{
Query query2 = database.getReference().child("TripInfo").child(uCodeID);
query2.addValueEventListener(valueEventListener2);
}
ValueEventListener valueEventListener2 = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
for (DataSnapshot snapshot: dataSnapshot.getChildren()){
TripInfo tripInfo = snapshot.getValue(TripInfo.class);
userID = tripInfo.getUserID();
Log.d(TAG, "1일치유저★userID "+userID);
DatabaseReference UserRef = database.getReference().child("User");
UserRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
for(DataSnapshot snapshot: dataSnapshot.getChildren()){
String who = dataSnapshot.child(userID).child("userID").getValue().toString();
UserList.clear();
User user = snapshot.getValue(User.class);
String a = user.getUserID();
UserList.add(user);
Log.d(TAG, "2유저리퍼★who "+who);
}
}
tripSearchAdapter2.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
我打印了日志,并得到了它。
D/여행정보검색: 1일치유저★userID D223Hlk5aMf17Su9rB9NeKEaT2c2 (userID1)
D/여행정보검색: 1일치유저★userID dirrk65x0GTEQ8zlRYZNryqrGYH2 (userID2)
D/여행정보검색: 1일치유저★userID shngJIzT8ieI1LiQ012peMHH5p13 (userID3)
/// These are correct values that I want.
D/여행정보검색: 2유저리퍼★who shngJIzT8ieI1LiQ012peMHH5p13 (userID3)
I/chatty: uid=10085(com.example.tkitaka_fb) identical 16 lines
D/여행정보검색: 2유저리퍼★who shngJIzT8ieI1LiQ012peMHH5p13
/// But here, I just got 1. Even it is last value of userID.
我认为我使用了错误的for循环或datasnapshot。我该怎么做才能获得正确的代码?
答案 0 :(得分:0)
您的嵌套侦听器会为发现的每个用户不断清除UserList
:
UserList.clear();
User user = snapshot.getValue(User.class);
String a = user.getUserID();
UserList.add(user);
对所有用户执行此操作后,最终得到一个仅包含最后一个用户的列表。
通常,在加载所有用户时,对于每次加载的行程,您的代码似乎都关闭了。更糟:您使用addValueListener
,这意味着如果更改了任何用户,则每次旅行都将重新加载所有用户。这不仅浪费很多,而且可能不正确。
更典型/惯用的做法是仅在每次旅行时加载用户(因此JSON树中的低一级),并使用addListenerForSingleValueEvent
(它将加载一次数据,然后停止监听)。 / p>
类似这样:
DatabaseReference UserRef = database.getReference().child("User").child(userID);
UserRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
User user = snapshot.getValue(User.class);
String a = user.getUserID();
UserList.add(user);
Log.d(TAG, "2유저리퍼★who "+a);
}
tripSearchAdapter2.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException();
}
});
您的代码与此代码之间的更改:
userID
传递到UserRef
路径,以便仅为当前旅程的用户加载数据。for(DataSnapshot snapshot: dataSnapshot.getChildren())
,因为我们只加载一个用户。String who = dataSnapshot.child("userID").getValue().toString()
,因为您在userID
中已经具有相同的值。UserList.clear();
,因为否则将在加载每个用户之后清除用户列表。onCancelled
,因为忽略错误绝不是一个好主意。