Android 尽管从Firebase添加了项目,ArrayList大小仍然为零

Android 尽管从Firebase添加了项目,ArrayList大小仍然为零,android,firebase,firebase-realtime-database,arraylist,Android,Firebase,Firebase Realtime Database,Arraylist,我有下面的代码,应该从Firebase读取数据并将其添加到数组列表NameList和addressList中。我在onDataChange事件中记录了这些值。logcat显示数据实际上是读取的,但当我迭代列表时,它的大小为零。有谁能帮我解决这个问题吗 @Override public void onStart() { super.onStart(); activeOrders = FirebaseDatabase.getInstance().getReference().ch

我有下面的代码,应该从Firebase读取数据并将其添加到数组列表NameList和addressList中。我在onDataChange事件中记录了这些值。logcat显示数据实际上是读取的,但当我迭代列表时,它的大小为零。有谁能帮我解决这个问题吗

 @Override
public void onStart() {
    super.onStart();

    activeOrders = FirebaseDatabase.getInstance().getReference().child("Ordered Items");
    activeOrders.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {

            for (DataSnapshot child: snapshot.getChildren())
            {
                key = child.getKey().toString();

                name = FirebaseDatabase.getInstance().getReference().child("Users").child(key).child("name");

                address = FirebaseDatabase.getInstance().getReference().child("Users").child(key).child("shippingAddr");

                name.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        Log.i("Username", snapshot.getValue().toString());
                        namesList.add(snapshot.getValue().toString());
                    }

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

                    }
                });

                address.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        Log.i("Address", snapshot.getValue().toString());
                        addressList.add(snapshot.getValue().toString());

                    }

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

                    }
                });

            }
        }

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

        }
    });

    Toast.makeText(this, "Size:" + namesList.size(), Toast.LENGTH_SHORT).show();

    for(int i=0; i<namesList.size(); i++){
        Toast.makeText(this, namesList.get(i).toString(), Toast.LENGTH_SHORT).show();
    }

    logout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            signOutUser();
        }
    });
@覆盖
public void onStart(){
super.onStart();
activeOrders=FirebaseDatabase.getInstance().getReference().child(“有序项”);
activeOrders.addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
对于(DataSnapshot子项:snapshot.getChildren())
{
key=child.getKey().toString();
name=FirebaseDatabase.getInstance().getReference().child(“用户”).child(键).child(“名称”);
address=FirebaseDatabase.getInstance().getReference().child(“用户”).child(键).child(“shippingAddr”);
name.addListenerForSingleValueEvent(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
Log.i(“用户名”,snapshot.getValue().toString());
添加(snapshot.getValue().toString());
}
@凌驾
已取消公共void(@NonNull DatabaseError){
}
});
addListenerForSingleValueEvent(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
Log.i(“地址”,snapshot.getValue().toString());
address.add(snapshot.getValue().toString());
}
@凌驾
已取消公共void(@NonNull DatabaseError){
}
});
}
}
@凌驾
已取消公共void(@NonNull DatabaseError){
}
});
Toast.makeText(这个,“Size:+namesList.Size(),Toast.LENGTH_SHORT).show();

对于(int i=0;i您正在主线程中迭代列表,而实际列表需要一些时间才能从firebase返回,这是因为所有firebase回调都在后台线程中运行

因此,下面的代码在实际数据到达之前在主线程中运行

for(int i=0; i<namesList.size(); i++){
    Toast.makeText(this, namesList.get(i).toString(), Toast.LENGTH_SHORT).show();
}
要解决这个问题,您可以如下所示转移迭代

activeOrders.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {

        for (DataSnapshot child: snapshot.getChildren())
        {
            key = child.getKey().toString();

            name = FirebaseDatabase.getInstance().getReference().child("Users").child(key).child("name");

            address = FirebaseDatabase.getInstance().getReference().child("Users").child(key).child("shippingAddr");

            name.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    Log.i("Username", snapshot.getValue().toString());
                    namesList.add(snapshot.getValue().toString());
                }

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

                }
            });

            address.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    Log.i("Address", snapshot.getValue().toString());
                    addressList.add(snapshot.getValue().toString());

                }

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

                }
            });

        }
        
        
        for(int i=0; i<namesList.size(); i++){
            Toast.makeText(this, namesList.get(i).toString(), Toast.LENGTH_SHORT).show();
        }
    }

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

    }
});
activeOrders.addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
对于(DataSnapshot子项:snapshot.getChildren())
{
key=child.getKey().toString();
name=FirebaseDatabase.getInstance().getReference().child(“用户”).child(键).child(“名称”);
address=FirebaseDatabase.getInstance().getReference().child(“用户”).child(键).child(“shippingAddr”);
name.addListenerForSingleValueEvent(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
Log.i(“用户名”,snapshot.getValue().toString());
添加(snapshot.getValue().toString());
}
@凌驾
已取消公共void(@NonNull DatabaseError){
}
});
addListenerForSingleValueEvent(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
Log.i(“地址”,snapshot.getValue().toString());
address.add(snapshot.getValue().toString());
}
@凌驾
已取消公共void(@NonNull DatabaseError){
}
});
}

对于(int i=0;i请编辑问题,以显示您期望此代码执行的与您期望的不同的操作。它还应显示您尝试查询的数据。如果看不到数据,我们将无法知道查询是否有意义。
activeOrders.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {

        for (DataSnapshot child: snapshot.getChildren())
        {
            key = child.getKey().toString();

            name = FirebaseDatabase.getInstance().getReference().child("Users").child(key).child("name");

            address = FirebaseDatabase.getInstance().getReference().child("Users").child(key).child("shippingAddr");

            name.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    Log.i("Username", snapshot.getValue().toString());
                    namesList.add(snapshot.getValue().toString());
                }

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

                }
            });

            address.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    Log.i("Address", snapshot.getValue().toString());
                    addressList.add(snapshot.getValue().toString());

                }

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

                }
            });

        }
        
        
        for(int i=0; i<namesList.size(); i++){
            Toast.makeText(this, namesList.get(i).toString(), Toast.LENGTH_SHORT).show();
        }
    }

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

    }
});