Android Firebase列表视图--->;哈希映射失败
我正试图从Firebase中检索餐厅名称数据,并在ListView中的各行中输出它们。我创建了一个仅由数字(字符串)组成的数据示例 检索数据似乎很好,因为我可以在控制台中逐行输出它们,但我的Hashmap将所有内容保存到同一个“节点”或“字段”中 谁能帮我理解我做错了什么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
@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}