使用Firebase Recyclerview总是返回最后一个值

时间:2019-10-09 11:55:36

标签: java android firebase firebase-realtime-database android-recyclerview

我的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。我该怎么做才能获得正确的代码?

1 个答案:

答案 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,因为忽略错误绝不是一个好主意。
相关问题