从Firebase Realtime Database获取name字段值失败,求解决方案
解决Firebase Realtime Database获取用户name字段的问题
我明白你的困扰了!你现在的代码把数据库里的用户**节点键(key)**加到了列表中,但你真正需要的是每个键对应的name字段值,这样点击列表项时才能拿到正确的name来创建聊天ID。
问题根源
看你的doOnSuccess方法,你只是遍历了数据库的顶层键,直接把键添加到了arrayList,并没有解析每个键下的用户对象,自然拿不到name字段。从你的数据库结构截图来看,每个用户节点下都包含name、username等属性,所以我们需要在遍历过程中取出这些属性。
修改方案
我们需要调整代码,在遍历用户键的时候,解析对应的用户JSON对象,提取name字段,同时保留必要的映射关系(如果后续需要用到用户key的话)。
步骤1:添加映射集合(可选但实用)
首先在类里添加一个HashMap,用来存储用户名(name)和节点键的对应关系,方便后续需要用到key的场景:
private HashMap<String, String> userKeyMap = new HashMap<>(); // 存储name -> 用户节点key
步骤2:修改doOnSuccess方法
修改遍历逻辑,解析每个用户节点的name字段:
public void doOnSuccess(String response) { try { JSONObject object = new JSONObject(response); Iterator<String> iterator = object.keys(); // 指定泛型String让代码更规范 while(iterator.hasNext()) { String userKey = iterator.next(); // 获取当前用户节点的完整JSON对象 JSONObject userObject = object.getJSONObject(userKey); String userName = userObject.getString("name"); String userUsername = userObject.getString("username"); // 排除当前登录用户 if(!userUsername.equals(UserDetails.username)) { arrayList.add(userName); // 将name添加到列表,这样列表显示的是用户名称 userKeyMap.put(userName, userKey); // 保存name和key的对应关系 } totalUsers++; } } catch (JSONException e) { Log.e(TAG, "解析用户数据失败", e); // 可以在这里添加异常处理,比如提示用户加载失败 } checkIfThereIsAnUser(totalUsers); }
步骤3:调整列表点击事件
现在点击列表项时,就能直接拿到name字段值了:
usersList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String selectedUserName = arrayList.get(position); UserDetails.chatWith = selectedUserName; // 这里存的就是你需要的name字段 // 如果后续聊天需要用到用户节点的key,可以从映射中获取: // String selectedUserKey = userKeyMap.get(selectedUserName); startActivity(new Intent(getContext(), Chat.class)); } });
额外建议
- 为了避免因某个用户节点缺少
name字段导致崩溃,可以在提取前先判断字段是否存在:if(userObject.has("name")) { String userName = userObject.getString("name"); // 后续逻辑... } - 考虑使用自定义
User类来封装用户信息,这样代码会更清晰易维护。
内容的提问来源于stack exchange,提问作者user6246272
相关产品推荐
相关产品推荐

