Android Firebase列表视图--->;哈希映射失败

Android Firebase列表视图--->;哈希映射失败,android,listview,layout,hashmap,firebase,Android,Listview,Layout,Hashmap,Firebase,我正试图从Firebase中检索餐厅名称数据,并在ListView中的各行中输出它们。我创建了一个仅由数字(字符串)组成的数据示例 检索数据似乎很好,因为我可以在控制台中逐行输出它们,但我的Hashmap将所有内容保存到同一个“节点”或“字段”中 谁能帮我理解我做错了什么 @Override public void onDataChange(DataSnapshot Snapshot) { int x = 1; //Do some

我正试图从Firebase中检索餐厅名称数据,并在ListView中的各行中输出它们。我创建了一个仅由数字(字符串)组成的数据示例

检索数据似乎很好,因为我可以在控制台中逐行输出它们,但我的Hashmap将所有内容保存到同一个“节点”或“字段”中

谁能帮我理解我做错了什么

@Override
        public void onDataChange(DataSnapshot Snapshot) {
            int x = 1;
            //Do some stuff once
            for (DataSnapshot RestNames : Snapshot.getChildren()) {
                name = RestNames.getValue().toString();
                //System.out.println(name);
                map.put(x, name);
                x=x+1;
            }
            System.out.println(map);
            Items.add(map);
            System.out.println(Items);
            listView.setAdapter(mgadapter);
        }
控制台中的输出如下所示:

 {8=3456, 11=9, 9=34567, 5=3, 3=3, 4=4, 10=0, 1=1, 7=345, 6=34, 2=2}
Android emulator为每一行显示相同的值

我想在单独的行上显示每个值

谢谢大家!

编辑:JSON的片段

{
 "Eat": {
  "Name": {
   "-Jy3yehAkgqhg4knlxx_": "1",
   "-Jy3yjQT2AxtZMqD2kov": "2",
   "-Jy3yk96Mo5MKOEEzviJ": "3",
   "-Jy3yksamL08R0BckxNZ": "4",
   "-Jy5JBJYZUTxZQtmdDmi": "3",
   "-Jy5JIXT_lDZrUOkF3T1": "34",
   "-Jy5JJ0oMqGrs2vfFge2": "345",
   "-Jy5JJTyET830PYOT3yA": "3456",
   "-Jy5JJu-jDGMDXncWDKf": "34567",
   "-Jy5JVejdsUtggM8vBoi": "0",
   "-Jy5JbwEoWrKAi6XIVQY": "9"
  }
 }
}

由于您的代码段中缺少一些代码,我完成了它并在本地运行了它:

Firebase ref = new Firebase("https://stackoverflow.firebaseio.com/32367022/Eat/Name");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        int x = 1;
        Map<Integer,Object> map = new HashMap<Integer, Object>();
        for (DataSnapshot child: snapshot.getChildren()) {
            String name = child.getValue().toString();
            System.out.println(name);
            map.put(x, name);
            x=x+1;
        }
        System.out.println(map);
    }
    @Override
    public void onCancelled(FirebaseError firebaseError) {
    }
});
第一行显示
for
循环内部的输出。最后几行显示了
HashMap

我使用最基本的Java类,这种行为在我看来是正确的

我希望
System.out.println(name)for
循环中的code>将为您显示与上面相同的输出,因为Firebase SDK在那里处理订购

如果循环中的顺序正确,则
映射
对象会更改顺序。如果不看这些类型的话,是不可能说的

但一般来说,上述方法是解决此问题的方法:将其隔离到单个对象/类,然后修复该类的错误(如果是您的代码)或将其替换为适用于您的用例的类(如果它来自库)

更新:我创建了一个最小的应用程序,在中的列表视图中以正确的顺序显示数字


你能在问题中加入一段JSON吗?通过在Chrome JavaScript控制台中执行以下命令,您可以从Firebase数据仪表板轻松获得此信息:
new Firebase('https://mine.firebaseio.com/once('value',函数{console.log(JSON.stringify(s.val(),null');},函数{console.error(e);})
@FrankvanPuffelen请查看文章底部的我的代码片段,非常感谢。这与问题没有直接关系,但我强烈建议将变量命名为
snapshot
restNames
,这样就可以清楚地看出它们是对象而不是类。这至少会使语法高亮显示正常工作。:)@fluffy Thank:D我会在Firebase还有一个OS lib来帮助填充ListView之后这样做:谢谢你的帮助,我做的和你的代码完全一样,但是映射顺序仍然不正确,我搜索了其他帖子,他们只是将整个映射添加到ArrayList对象以添加到ListView适配器,但我的只是简单地输出{8=3456, 11=9, 9=34567, 5=3, 3=3, 4=4, 10=0, 1=1, 7=345, 6=34, 2=2}在ListView上听了11次。这意味着你在听错误级别的树。你的ref可能指向
Eat
,而不是
Name
。我原来的路径是/Eat/Name,但它们都返回了相同的结果集。我只是尝试将hashmap更改为linkedhashmap,它按顺序返回列表。但我仍然有listview显示整组数据11次出现问题。非常感谢您的帮助。Minimal应用程序演示了如何在Android listview中显示数字:^以上内容确实帮助我解决了问题,我意识到我不知道如何使用字符串数组存储项目,但这真的很有帮助!非常感谢Frank!
1
2
3
4
3
34
345
3456
34567
0
9
{1=1, 2=2, 3=3, 4=4, 5=3, 6=34, 7=345, 8=3456, 9=34567, 10=0, 11=9}