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

标签 java android firebase firebase-realtime-database

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

这是我的代码来完成这个:

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


    }

我在这段代码中有 2 个 ValueEventListeners。我将用户信息添加到内部列表中。 问题是在此过程结束时列表为空。

我想用这些信息填充 ListView :

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

                        friendRequestsReceived_ListView.setAdapter(friendRequestsReceived_Adapter);

当我将它们放在内部监听器中时,它工作正常,但我不想为列表中的每个用户设置适配器,仅在 for 循环之后。

我附上了我的数据库结构的屏幕截图(我不需要获取所有参数):

enter image description here

最佳答案

列表为空,因为您在内部 onDataChange() 方法之外声明了 friendRequestsReceived_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) {

    }
});

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

关于java - Firebase - 尝试将每个用户的数据检索到列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45521162/

相关文章:

log4j 记录器和 java.util.logging 的 java 包装器

java - 双击时禁用 TreeItem 的默认展开/折叠 (JavaFX 8)

java - 检查 UUID 字符串是否为素数

android - Println 需要一条消息

android - 线性布局不应切断

android - Android BLE 数据写入问题 - 获取错误 133

java - 如何在序列化为 GWT AutoBean 时保留 LinkedHashMap 的顺序?

ios - 类型 'NSNotification.Name?' 没有成员 'firInstanceIDTokenRefresh'

android - 如何使用 Firebase 推送消息取决于用户在设备上的帐户状态

angular - 在强制转换的 Typescript 类上调用方法