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

Posted

技术标签:

【中文标题】尽管从 Firebase 添加了项目,但 ArrayList 的大小仍然为零【英文标题】:ArrayList size remains zero despite adding items from Firebase 【发布时间】: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();
        
    );

【问题讨论】:

请编辑问题以显示您期望此代码执行的操作与您期望的不同。它还应该显示您尝试查询的数据。如果没有看到数据,我们就无法知道查询是否有意义。 【参考方案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) 

    
);

【讨论】:

以上是关于尽管从 Firebase 添加了项目,但 ArrayList 的大小仍然为零的主要内容,如果未能解决你的问题,请参考以下文章

将数据类的对象添加到 Kotlin 的 Firestore 时如何添加 Firebase 时间戳?

尽管添加了自动布局约束,但 UIScrollView 不滚动

尽管没有引发错误,但图像似乎没有上传到 Firebase 存储

Firebase 无法运行 iOS

将 android 项目从 pc 移动到另一个,Firebase Auth 问题? [复制]

尝试从 Android Studio 添加 Firebase 项目时出错