使用cloud firestore将文档结果添加到Array <object>变量

时间:2018-02-03 20:06:47

标签: android firebase google-cloud-firestore

我试图将所有文档的结果放在ArrayList变量中时遇到问题,我可以得到结果,但我只能在onComplete方法中使用它们。我甚至可以用我得到的数据设置我的txtviews但我不能将它存储在Arraylist中。我使用此var作为我的适配器的参数来查看ListView中的所有这些项。我做错了什么?

public List<Producto> menu;
menu= new ArrayList<Product>();
//Reference to the collection I want to get all documents
colRef
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if(task.isSuccessful()){
                        int i = 0;
                        for(DocumentSnapshot document : task.getResult()){
                            Product product = document.toObject(Product.class);

                            menu.add(producto);
                            Toast.makeText(MenuActivity.this, ""+menu.get(i).getName(), Toast.LENGTH_SHORT).show();
                            i++;
                        }
                    }else{
                        Toast.makeText(MenuActivity.this, "Error", Toast.LENGTH_SHORT).show();
                    }
                }
            });

    Toast.makeText(MenuActivity.this, ""+productosMenu.size(), Toast.LENGTH_SHORT).show();

循环上的Toast,显示保存到ArrayList但在侦听器外部的数据我再次验证ArrayList的大小,我得到0大小,当然我的屏幕是空的,因为适配器无法读取任何项目阵... 我是新的android和firebase,但试图学习,我正在制作餐厅应用程序。我很感激,如果有人可以指导我,我无法找到任何其他线索,我做错了什么。感谢。

1 个答案:

答案 0 :(得分:0)

addLayer方法是异步的。它在执行查询时立即返回。这意味着在最后一行执行Toast时,get()数组将为空。

如果您只想在查询完成后执行某些工作,请在menu返回的任务的回调中执行此操作,您当前正在迭代结果中的文档。