如何获取Firebase android中所有子级的列表?

如何获取Firebase android中所有子级的列表?,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我在Firebase有这个模型 我正在尝试使用下面的代码从子节点帖子中获取所有值 databasePostsReference = FirebaseDatabase.getInstance().getReference().child("posts"); final List<UserPostPOJO> list = Collections.EMPTY_LIST; databasePostsReference.addValueEventListener(new

我在Firebase有这个模型

我正在尝试使用下面的代码从子节点帖子中获取所有值

  databasePostsReference = 
  FirebaseDatabase.getInstance().getReference().child("posts");

 final List<UserPostPOJO> list = Collections.EMPTY_LIST;

  databasePostsReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                Log.d(TAG, "onDataChange: entered list adding");
                UserPostPOJO post = snapshot.getValue(UserPostPOJO.class);
                list.add(post);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
错误日志:

  05-08 22:19:49.706 6421-6421/redeyes17.com.abhi.android.iamat                      
    D/recentfragment: onDataChange: entered list adding
   05-08 22:19:49.726 6421-6421/redeyes17.com.abhi.android.iamat 
    E/AndroidRuntime: FATAL EXCEPTION: main

   Process: redeyes17.com.abhi.android.iamat, PID: 6421

   java.lang.UnsupportedOperationException

   at java.util.AbstractList.add(AbstractList.java:404)

   at java.util.AbstractList.add(AbstractList.java:425)

   at redeyes17.com.abhi.android.iamat.UI.tabs
  .RecentFragment$1.onDataChange(RecentFragment.java:78)

  at com.google.android.gms.internal.zzbpx.zza(Unknown Source)

  at com.google.android.gms.internal.zzbqx.zzZT(Unknown Source)

  at com.google.android.gms.internal.zzbra$1.run(Unknown Source)

   at android.os.Handler.handleCallback(Handler.java:739)

  at android.os.Handler.dispatchMessage(Handler.java:95)

  at android.os.Looper.loop(Looper.java:158)

  at android.app.ActivityThread.main(ActivityThread.java:7230)

  at java.lang.reflect.Method.invoke(Native Method)

 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller
 .run(ZygoteInit.java:1230)

 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

要获取所有这些值,请使用以下代码:

    databasePostsReference = FirebaseDatabase.getInstance().getReference().child("posts").child(postId);
    ValueEventListener eventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
           List<UserPostPOJO> list = new ArrayList<>();

           String elevation = (String) dataSnapshot.child("elevation").getValue();
           String feel = (String) dataSnapshot.child("feel").getValue();
           String uid = (String) dataSnapshot.child("uid").getValue();
           String uri = (String) dataSnapshot.child("uri").getValue();

          UserPostPOJO userPostPOJO = new UserPostPOJO();
          userPostPOJO.setElevation(elevation);
          userPostPOJO.setFeel(feel);
          userPostPOJO.setUid(uid);
          userPostPOJO.setUri(uri);

          list.add(userPostPOJO);
    }

          @Override
          public void onCancelled(DatabaseError databaseError) {}
};
databasePostsReference.addListenerForSingleValueEvent(eventListener);
databasePostsReference=FirebaseDatabase.getInstance().getReference().child(“posts”).child(postId);
ValueEventListener eventListener=新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
列表=新的ArrayList();
字符串高程=(字符串)dataSnapshot.child(“高程”).getValue();
String feel=(String)dataSnapshot.child(“feel”).getValue();
字符串uid=(字符串)dataSnapshot.child(“uid”).getValue();
字符串uri=(字符串)dataSnapshot.child(“uri”).getValue();
userpostojo userpostojo=新的userpostojo();
userPostPOJO.setElevation(标高);
userpostojo.setFeel(feel);
userpospojo.setUid(uid);
userpospojo.setUri(uri);
list.add(userpostojo);
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){}
};
databasePostsReference.addListenerForSingleValueEvent(eventListener);
其中,
postId
是由
push()
方法生成的唯一id。请注意,
列表的声明必须在
onDataChange()
方法中,否则将得到null


希望有帮助。

你好,阿比拉什。如果您可以发布完整的日志和
userpostojo
类,这会有所帮助。干杯您好@AL。感谢回复。我在阅读了大量文章后发布了代码。我了解到firebase操作是异步操作,因此尝试将onDataChange方法中的值分配给全局变量会引发异常以使全局变量最终化声明全局最终化后,您无法在此处分配任何内容,所以修复方法是进行回调,当你想分配时,你必须使用回调来分配,但我不知道如何使用回调,请你解释一下,如果这一切都有意义的话,这就是解决你的问题:嗨,亚历克斯,我最终找到了这个方法,这是可行的。我想知道我们是否可以将onDataChange方法中的本地列表分配给全局变量中的列表。很高兴听到您解决了这个问题。否,您不能使
列表
成为全局变量,因为
onDataChange
方法是异步调用的。这意味着将数据添加到列表中的语句在调用
onDataChange
之前执行,如前所述,您将得到
null
。如果你想更多地了解这一点,请访问这个和这个。如果你认为我的答案对你有帮助,请考虑接受它。谢谢我试图接受它,但不能接受,因为我的声誉很低,如果我的问题是有效的,请投票,我还有一个问题,如果你不介意回答的话。我有一个firebase的孩子,他的孩子都是按键,如何按升序和降序排序,基本上想检索最近的孩子,但当我把recycler视图放入recycler视图时,recycler视图正在移动到recycler视图的末尾,默认情况下如何处理,这些按键是按升序排列的。要筛选Firebase中的数据,请访问。你不能投赞成票,因为声誉很低,但
你可以接受它
。请考虑<代码>点击答案< /代码>旁边的复选标记,将其从灰色变为填充。谢谢
    databasePostsReference = FirebaseDatabase.getInstance().getReference().child("posts").child(postId);
    ValueEventListener eventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
           List<UserPostPOJO> list = new ArrayList<>();

           String elevation = (String) dataSnapshot.child("elevation").getValue();
           String feel = (String) dataSnapshot.child("feel").getValue();
           String uid = (String) dataSnapshot.child("uid").getValue();
           String uri = (String) dataSnapshot.child("uri").getValue();

          UserPostPOJO userPostPOJO = new UserPostPOJO();
          userPostPOJO.setElevation(elevation);
          userPostPOJO.setFeel(feel);
          userPostPOJO.setUid(uid);
          userPostPOJO.setUri(uri);

          list.add(userPostPOJO);
    }

          @Override
          public void onCancelled(DatabaseError databaseError) {}
};
databasePostsReference.addListenerForSingleValueEvent(eventListener);