![](/img/trans.png)
[英]RecyclerView findLastCompletelyVisibleItemPosition always returns last element
[英]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.