【问题标题】:ArrayList size remains zero despite adding items from Firebase尽管从 Firebase 添加了项目,但 ArrayList 的大小仍然为零
【发布时间】:2020-10-22 04:26:22
【问题描述】:

我有以下代码应该从 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();
        }
    });

【问题讨论】:

  • 请编辑问题以显示您期望此代码执行的操作与您期望的不同。它还应该显示您尝试查询的数据。如果没有看到数据,我们就无法知道查询是否有意义。

标签: android firebase firebase-realtime-database arraylist


【解决方案1】:

您正在主线程中迭代列表,而实际列表需要一些时间才能从 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) {

    }
});

【讨论】:

    猜你喜欢
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多