尽管从Firebase添加了项,但ArrayList的大小仍为零

时间:2020-07-01 16:49:17

标签: android firebase firebase-realtime-database arraylist

我有以下代码,应该从Firebase读取数据并将其添加到数组列表namesList和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();
        }
    });

1 个答案:

答案 0 :(得分:0)

您要在主线程中迭代该列表,而实际列表需要一些时间才能从firebase返回,这是因为所有firebase回调都在后台线程中运行(包括此线程)

因此,以下代码在实际数据输入之前在主线程中运行

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

以下代码在Firebase后台线程中运行

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

要解决此问题,您可以按以下方式转移迭代

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) {

    }
});
相关问题