【问题标题】:Retrieve the IDs of a user's friends and show in RecyclerView the data of each friend (Firebase)检索用户朋友的 ID 并在 Recycler 中显示每个朋友的数据(Firebase)
【发布时间】:2020-12-31 15:34:15
【问题描述】:

在 Firebase 中,我有一个“usuario”节点,其中包含每个注册用户的数据。我想检索用户朋友的 ID,并通过这些 ID 在 Recycler 中显示查看每个朋友的数据(标识符、姓名和照片地址)。

我在 Firebase 中的结构:

我试过这段代码,但它不起作用。列表为空:

ref = ConfigFirebase.getFirebaseDatabase().child("usuarios"); //code in OnCreate

//My method
ref = ref.child(idUserLog).child("friends");

ref.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        for (DataSnapshot idFriends: dataSnapshot.getChildren()){

            DataUserFriend dataUserFriend = idFriends.getValue(DataUserFriend.class);
            String id = dataUserFriend.getIdUser();
            ref.child(id).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        DataUser dataUser = dataSnapshot.getValue(DataUser.class);
                        listFriends.add(dataUser);
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });
            }
        }
        listFriendsAdapter.notifyDataSetChanged();
    }
    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
});

怎么了?还是我应该尝试其他方式?

解决方案:

ref = ConfigFirebase.getFirebaseDatabase().child("usuarios"); //code in OnCreate

//My method
ref = ref.child(idUserLog).child("friends");

    ref.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        
        final int numFriends = (int) dataSnapshot.getChildrenCount();
        
        if(numFriends != 0){
            for (DataSnapshot idFriends: dataSnapshot.getChildren()){

                DataUserFriend dataUserFriend = idFriends.getValue(DataUserFriend.class);
                String id = dataUserFriend.getIdUser();
                ref =  ConfigFirebase.getFirebaseDatabase().child("usuarios").child(id);
                ref.addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                            DataUser dataUser = dataSnapshot.getValue(DataUser.class);
                            listFriends.add(dataUser);
                            
                            if(listFriends.size() == numFriends){
                            listFriendsAdapter.notifyDataSetChanged();
                            }
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {

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

        }
    });

【问题讨论】:

  • 请仅使用android-studio 标签来回答有关 Android Studio IDE 本身的问题。对于一般的 Android 编程问题,请使用android 标签。

标签: android firebase firebase-realtime-database


【解决方案1】:

listFriendsAdapter.notifyDataSetChanged() 的调用应该与更新listFriends 的方法相同。

所以:

ref.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot idFriends: dataSnapshot.getChildren()){
            DataUserFriend dataUserFriend = idFriends.getValue(DataUserFriend.class);
            String id = dataUserFriend.getIdUser();
            ref.child(id).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        DataUser dataUser = dataSnapshot.getValue(DataUser.class);
                        listFriends.add(dataUser);
                        listFriendsAdapter.notifyDataSetChanged();
                    }

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

如果您只想在所有朋友都已添加到listFriends 时才调用listFriendsAdapter.notifyDataSetChanged(),您可以计算内部onDataChange 被调用的频率并将其与朋友ID 的数量进行比较。

【讨论】:

  • 感谢您的帮助。我听从了建议,它奏效了。
【解决方案2】:

您在数据库引用对象上添加了SingleValueEvent 侦听器,因此不会立即触发回调。您应该创建一个Query 并为其添加SingleValueEvent 侦听器。例如:

    DatabaseReference mDatabase;
    mDatabase = FirebaseDatabase.getInstance().getReference("usuarios");
    Query query = mDatabase.child(idUserLog).child("friends");
    query .addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
             // Code to parse and display data
                
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
     });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多