簡體   English   中英

使用 firebase recyclerview 總是返回最后一個值

[英]Using firebase recyclerview always returns last value

我的 firebase recyclerview 總是只返回最后一個值。 我想在回收站視圖中顯示用戶名,所以我使用了 Query。

這是我嘗試過的

如果我選擇“Hungary”,找到 TripInfo-Hungary 節點並帶上用戶 ID。 接下來,使用從匈牙利帶來的用戶節點中查找。

我想要得到的類似於這個 sql。 來自 Tripinfo 的 Select 用戶 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-loop 或 datasnapshot。 我應該怎么做才能獲得正確的代碼?

您的嵌套偵聽器會不斷清除它找到的每個用戶的UserList

UserList.clear();
User user = snapshot.getValue(User.class);
String a = user.getUserID();

UserList.add(user);

為所有用戶執行此操作后,您最終會得到一個僅包含最后一個用戶的列表。

一般來說,您的代碼似乎關閉了,因為您正在加載所有用戶,對於您加載的每次旅行。 更糟糕的是:您使用addValueListener ,這意味着如果任何用戶發生更改,您將為每次旅行重新加載所有用戶。 這不僅非常浪費,而且可能不正確。

更典型/慣用的是只為每次行程加載用戶(因此在 JSON 樹中低一級),並使用addListenerForSingleValueEvent (它將加載一次數據,然后停止收聽)。

所以像:

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 ,因為忽略錯誤從來都不是一個好主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM