You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 11:15:03