Java Firebase-尝试将每个用户的数据检索到列表中

Java Firebase-尝试将每个用户的数据检索到列表中,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我的应用程序中的每个用户都可以发送和获取好友请求。当用户检查他的好友请求时,我希望应用程序检查发送给他的好友请求的每个用户,并从实时数据库中检索他的信息 这是我的代码,以实现这一点: public void check_For_Friends_And_Requests(){ String loggedUser=SaveSharedPreference.getLoggedEmail(getApplicationContext()); final Dat

我的应用程序中的每个用户都可以发送和获取好友请求。当用户检查他的好友请求时,我希望应用程序检查发送给他的好友请求的每个用户,并从
实时数据库
中检索他的信息

这是我的代码,以实现这一点:

 public void check_For_Friends_And_Requests(){
        String loggedUser=SaveSharedPreference.getLoggedEmail(getApplicationContext());


            final DatabaseReference mDatabase= FirebaseDatabase.getInstance().getReference();
            final DatabaseReference userRef=mDatabase.child("Users").child(loggedUser);

            userRef.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if (dataSnapshot.exists()){

                        final List<User> friendRequestsReceived_UserList=new ArrayList<>();

                        for (DataSnapshot postSnapshot: dataSnapshot.child("friend_requests_received").getChildren()) {

                            final String senderEmail=postSnapshot.getKey();

                            Toast.makeText(getApplicationContext(),
                                    senderEmail, Toast.LENGTH_SHORT).show();

                            if (senderEmail!=null){
                                mDatabase.child("Users").child(senderEmail).addListenerForSingleValueEvent(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(DataSnapshot dataSnapshot) {
                                        Toast.makeText(getApplicationContext(),
                                                dataSnapshot.child("name").getValue(String.class), Toast.LENGTH_SHORT).show();

                                        friendRequestsReceived_UserList.add(
                                                new User(
                                                        senderEmail,
                                                        dataSnapshot.child("name").getValue(String.class),
                                                       dataSnapshot.child("level").getValue(Integer.class),
                                                        dataSnapshot.child("skill").getValue(Double.class)));

                                    }

                                    @Override
                                    public void onCancelled(DatabaseError databaseError) {

                                    }
                                });

                            }
                        }

                        UserListAdapter friendRequestsReceived_Adapter =
                        new UserListAdapter(getApplicationContext(),
                                R.layout.friend_requests_received_listview_row,
                                friendRequestsReceived_UserList);

                        friendRequestsReceived_ListView.setAdapter(friendRequestsReceived_Adapter);

                    }

                    else
                    connectionErrorGoToMain();
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    connectionErrorGoToMain();
                }
            });


    }
当我将它们放在Inner侦听器中时,效果很好,但我不想为列表中的每个用户设置适配器,只在
for
循环之后

我正在附加一个带有数据库结构的屏幕截图(我不需要获取所有参数):


列表为空,因为您在内部
onDataChange()
方法之外声明了
friendRequestsReceived\u UserList
。这是由于在将这些新对象添加到列表之前调用了
onDataChange()
方法的异步行为造成的。因此,为了解决这个问题,只需将列表的声明移动到内部
onDataChange()
方法中,如下所示:

if (senderEmail!=null){
mDatabase.child("Users").child(senderEmail).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        final List<User> friendRequestsReceived_UserList=new ArrayList<>(); //Moved here

    Toast.makeText(getApplicationContext(), dataSnapshot.child("name").getValue(String.class), Toast.LENGTH_SHORT).show();

    friendRequestsReceived_UserList.add(
        new User(
            senderEmail,
            dataSnapshot.child("name").getValue(String.class),
                dataSnapshot.child("level").getValue(Integer.class),
            dataSnapshot.child("skill").getValue(Double.class)));
            UserListAdapter friendRequestsReceived_Adapter =

     new UserListAdapter(getApplicationContext(), R.layout.friend_requests_received_listview_row, friendRequestsReceived_UserList);
     friendRequestsReceived_ListView.setAdapter(friendRequestsReceived_Adapter);

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});
if(senderEmail!=null){
mDatabase.child(“用户”).child(senderEmail).addListenerForSingleValueEvent(新值EventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
final List friendRequestsReceived_UserList=new ArrayList();//移动到此处
Toast.makeText(getApplicationContext(),dataSnapshot.child(“name”).getValue(String.class),Toast.LENGTH\u SHORT.show();
friendRequestsReceived_UserList.add(
新用户(
发送电子邮件,
dataSnapshot.child(“name”).getValue(String.class),
dataSnapshot.child(“level”).getValue(Integer.class),
dataSnapshot.child(“skill”).getValue(Double.class));
UserListAdapter friendRequestsReceived_适配器=
新的UserListAdapter(getApplicationContext(),R.layout.friend\u请求\u已接收\u listview\u行,friendRequestsReceived\u用户列表);
friendRequestsReceived_ListView.setAdapter(friendRequestsReceived_Adapter);
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});

正如您可能看到的,我也在内部方法中设置了适配器。如果您想在
onDataChange()
之外使用该列表,我建议您阅读我的答案。

我需要您查看您的Firebase数据structure@ILAYS_Kerbal我添加了一个屏幕截图,您所能做的就是…存储每个对象的列表,比如类的使用{List friendReuqest=new ArrayList();String name;}并在Ondata change侦听器中对friendReqest子级执行嵌套查询,将dataSnapshot传递给它,然后将setvalue传递给模型。首先获取列表,然后在模型中添加列表,并将其存储在userList dataSnapshot.getValue(User.class)中,如果我要在内部onDataChange()中设置适配器的话,我要在“for”循环中设置它,实际上为其中的每个对象设置它。我只想在“for”之后设置一次循环,当列表中充满对象时。由于需要使用嵌套查询,这意味着您需要异步加载数据两次,因此无法使用数据库结构实现此目的。如果在
onDataChange()
方法之外使用该列表(不包括该方法)它总是空的。你有两种可能。使用我的答案,它工作得很好,或者改变你的数据库结构,只需要一个查询。我不明白,你在这篇文章中的答案是否有助于我将适配器放在“for”之后循环?如果是,我就不明白了。这是我从代码中的代码实现代码的尝试:我没有说在for循环内部或外部设置适配器。我只是说需要声明并使用
ArrayList
inside
onDataChange()
method,因为否则为null。因为
ArrayList
包含该方法内部的信息,所以必须在该方法中设置适配器。
if (senderEmail!=null){
mDatabase.child("Users").child(senderEmail).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        final List<User> friendRequestsReceived_UserList=new ArrayList<>(); //Moved here

    Toast.makeText(getApplicationContext(), dataSnapshot.child("name").getValue(String.class), Toast.LENGTH_SHORT).show();

    friendRequestsReceived_UserList.add(
        new User(
            senderEmail,
            dataSnapshot.child("name").getValue(String.class),
                dataSnapshot.child("level").getValue(Integer.class),
            dataSnapshot.child("skill").getValue(Double.class)));
            UserListAdapter friendRequestsReceived_Adapter =

     new UserListAdapter(getApplicationContext(), R.layout.friend_requests_received_listview_row, friendRequestsReceived_UserList);
     friendRequestsReceived_ListView.setAdapter(friendRequestsReceived_Adapter);

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});