在适当的时候使用Firebase数据监听器

时间:2017-09-17 04:16:45

标签: android firebase firebase-realtime-database firebaseui

我在这里遇到了问题。 我有一个叫做“用户”的Firebase数据库子,里面有我称为“团队”的其他孩子,我必须把内容带到“团队”里面并用FirebaseAdapter在ListView中显示它们。

FirebaseAdapter是这样的:

FirebaseListAdapter<String> firebaseListAdapter = new FirebaseListAdapter<String>(
            this,
            String.class,
            android.R.layout.simple_list_item_1,
            //todo Conseguir exibir na lista, as equipes embedadas no usuário logado
            mRef.child("users").child(idUser).child("teams")


    )

正如你所看到的,我想把一个特定孩子中的“团队”带到我使用“idUser”进行搜索。 这个“idUser”是使用来自firebase的数据快照获取的,我在其中搜索登录应用程序的用户的id。 数据快照代码如下:

    user = mAuth.getCurrentUser().getEmail().toString();
    mRef = FirebaseDatabase.getInstance().getReference();
    Query query = mRef.child("usuarios").orderByChild("email").equalTo(user);
    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot child : dataSnapshot.getChildren()){
                idUser = child.getKey().toString();
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

我的问题是,在执行查询之前,在FirebaseListAdapter的代码部分中调用了“idUser”。所以我收到一个错误,因为idUser是空的。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

要解决此问题,请在onDataChange()方法中移动idUser String的声明,否则它将始终为null

String idUser = child.getKey().toString();

这是由于onDataChange()方法的异步行为造成的,即使您将.child(idUser)分配给DatabaseReference之前也会调用此方法。

在方法中移动声明并在那里移动using it,解决您的问题。在方法中也使用log语句,如下所示:

Log("TAG", idUser);

如果您想在该方法之外使用该字符串的值,请查看我在这篇文章中的回答How To Get Async Value Outside onDataChange() Method

希望它有所帮助。

答案 1 :(得分:0)

我只是在de listener中移动firebaseadapter的代码解决了这个问题。