【问题标题】:Get number of childs firebase android and put all the childs in a String arrayList获取子元素firebase android的数量并将所有子元素放入字符串数组列表中
【发布时间】:2018-10-16 12:26:37
【问题描述】:

我的孩子列表截图

我需要获取孩子的数量(没有嵌套的孩子!)并将其存储在全局公共变量中。另外,我希望所有的孩子都放在一个字符串数组列表中。

提前致谢!

【问题讨论】:

  • 您好,欢迎使用 stackoverflow。那么到目前为止,您尝试了哪些方法来达到同样的效果。
  • 嗨 santhosh,我尝试在侦听器之外创建一个列表变量,并在 for() 循环中添加每个键值,但没有奏效,对于计数,我使用了 arraylist.size() ;
  • @Hafeezulhaq 请查看how to create a minimal, complete, verifiable example。这是我们了解您遇到的问题的最佳方式。

标签: android firebase arraylist firebase-realtime-database


【解决方案1】:

使用某种形式的监听器。对于单一查找,请使用 valueEventListener。

然后在自动生成的 OnDataChange() 方法中。使用数据快照获取 childrenCount,然后浏览孩子并将它们添加到列表中

List<String> list = new ArrayList<>();
long childrenCount;
public void getListItems()
{
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
    ref.addValueEventListener(new ValueEventListener()
    {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot)
        {
            childrenCount = dataSnapshot.child("searchingUsers").getChildrenCount();
            for (DataSnapshot snap : dataSnapshot.child("searchingUsers").getChildren())
            {
                //If you want the node value
                list.add(snap.getValue().toString());

                //If you want the key value
                list.add(snap.getKey());
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            throw databaseError.toException(); // don't ignore errors
        }
    });
}

这使得这两个变量在 Activity 中都是全局的。因此,您可以从 Activity 中的任何位置联系他们

【讨论】:

  • 谢谢你的回答,但你能告诉我如何在监听器范围之外使用'list'和childrenCount变量
  • 你真的不能。您必须将需要数据的代码移动到 onDataChange 或从那里调用它。见stackoverflow.com/questions/41163512/…stackoverflow.com/questions/50434836/…
  • 见编辑。当您在函数外部声明变量时,您可以从活动中的任何位置访问它们,而不仅仅是在侦听器中。我只是不确定这是否是最佳做法
  • “列表”仍然是空的,我不知道为什么虽然我尝试了 public List itemsList() 并返回列表变量,但没有工作!
  • 感谢您的贡献,得到了解决方案!通过在侦听器范围内执行任务!
【解决方案2】:

要获取所有这些随机值的列表,请使用以下代码行:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference searchingUsersRef = rootRef.child("searchingUsers");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<String> list = new ArrayList<>();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String value = ds.getValue(String.class);
            list.add(value);
        }

        //Do what you need to do with your list
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage());
    }
};
searchingUsersRef.addListenerForSingleValueEvent(valueEventListener);

如你所见,我只在回调内部使用了列表,如果你想在外部使用列表,我建议你从这个 post 中查看我的 anwser 的最后一部分,其中我已经解释了如何使用自定义回调来完成。您也可以看看这个 video 以获得更好的理解。

【讨论】:

  • 很高兴听到这个消息。在这种情况下,请考虑通过单击投票箭头下的复选标记来接受我的回答,应该将颜色更改为绿色。我会很感激的。谢谢!
  • 完成,谢谢!但看起来我只能勾选一个答案,那就是第一个。
  • @janwilx72 的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
相关资源
最近更新 更多