【问题标题】:Android Firebase Listview ---> Hashmap FailAndroid Firebase Listview ---> Hashmap 失败
【发布时间】:2015-09-03 04:35:43
【问题描述】:

我正在尝试从 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 模拟器为每一行显示相同的值。

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

谢谢!

编辑: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"
  }
 }
}

【问题讨论】:

  • 您能否将 JSON 的 sn-p 包含在问题中?通过在 Chrome JavaScript 控制台中执行此操作,您可以从 Firebase 数据仪表板轻松获取此信息:new Firebase('https://mine.firebaseio.com/').once('value', function(s) { console.log(JSON.stringify(s.val(), null, ' ')); }, function(e) { console.error(e); })
  • @FrankvanPuffelen 请在帖子底部查看我的 sn-p,谢谢!
  • 这与问题没有直接关系,但我强烈建议您将变量命名为 snapshot 和 restNames,因此很明显它们是对象而不是类。它至少会使语法荧光笔正常工作。 :)
  • @fluffy 谢谢 :D 我会在之后这样做
  • Firebase 还有一个操作系统库来帮助填充 ListView:github.com/firebase/firebaseui-android

标签: android listview layout hashmap firebase


【解决方案1】:

由于我们在您的 sn-p 中缺少一些代码,因此我完成了它并在本地运行它:

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) {
    }
});

这会为我打印出以下内容:

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}

第一行显示for 循环内部的输出。最后几行显示HashMap。

我使用最基本的 Java 类,这种行为对我来说似乎是正确的。

我希望 for 循环内的 System.out.println(name); 会为您显示与上述相同的输出,因为 Firebase SDK 会在那里处理排序。

如果循环中的顺序正确,您的map 或Items 对象会更改顺序。没有看到这些类型就不可能说。

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

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

【讨论】:

  • 感谢您的帮助,我完全喜欢您的代码,但 Map 顺序仍然不正确,我搜索了其他帖子,他们只是将整个 Map 添加到 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,它按顺序返回了列表。但是我仍然无法让列表视图显示整组 11 次。非常感谢您的帮助
  • 显示如何在 Android 列表视图中显示数字的最小应用程序:github.com/puf/firebase-stackoverflow-android
  • ^以上确实帮助我解决了问题,我意识到我不知道如何使用字符串数组存储项目,但这真的很有帮助!非常感谢弗兰克!
猜你喜欢
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 2018-01-31
相关资源
最近更新 更多