从Firebase Realtime Database拉取全量用户仅可见晚注册用户如何解决
问题原因
你的代码核心错误出现在遍历用户节点的逻辑判断里:
if (userId.equals(currentUser.getUid())) return;
这里的return会直接终止整个onDataChange方法的执行,而不是仅跳过当前登录用户的节点。结合你的遍历顺序是从注册最晚的用户到注册最早的用户依次遍历,就会出现你描述的现象:
- 登录TestUser4:遍历到的第一个节点就是自己,直接return,没有任何用户被加入列表
- 登录TestUser3:遍历到TestUser4(加入列表)→ 遍历到自己(直接return,后面的TestUser2、TestUser1没有被处理)
- 登录TestUser2:遍历到TestUser4(加入)→ TestUser3(加入)→ 自己(return,TestUser1没被处理)
- 登录TestUser1:遍历到TestUser4、3、2都加入列表,最后碰到自己return,所以能看到所有其他用户
修复方案
把return改成continue即可,continue的作用是仅跳过当前这一轮循环,继续处理后续的其他用户节点:
if (userId.equals(currentUser.getUid())) continue; // 替换原来的return
额外优化建议
你当前把列表刷新、UI状态更新的逻辑写在了for循环内部,会导致每次新增一个用户就触发一次列表刷新,性能较差,建议把这部分逻辑移到for循环外部,等所有用户数据处理完毕后再统一操作:
@SuppressLint("NotifyDataSetChanged") @Override public void onDataChange(@NonNull DataSnapshot snapshot) { findFriendsModelList.clear(); for (DataSnapshot ds : snapshot.getChildren()) { String userId = ds.getKey(); if (userId.equals(currentUser.getUid())) continue; // 修复后的逻辑 if (ds.child(NodeNames.NAME).getValue()!=null) { String fullName = ds.child(NodeNames.NAME).getValue().toString(); String photoName = ds.child(NodeNames.PHOTO).getValue().toString(); findFriendsModelList.add(new FindFriendsModel(fullName,photoName,userId,false)); } } // 统一处理UI更新 findFriendsAdapter.notifyDataSetChanged(); progressBar.setVisibility(View.GONE); if (findFriendsModelList.isEmpty()) { tvFindFriends.setVisibility(View.VISIBLE); } else { tvFindFriends.setVisibility(View.GONE); } }
内容的提问来源于stack exchange,提问作者Apricot
相关产品推荐
相关产品推荐

