在OnMapReady中被调用之前,如何确保ArrayList填充在OnCreate方法中?

时间:2019-06-03 15:02:58

标签: android

我正在从Firestore数据库中检索数据,并希望在Google Map上为每个检索到的位置添加标记。但是,我的问题是,在我实际上可以使用检索到的位置填充ArrayList之前,先调用OnMapReady方法。

通过使用Breakpoints进行测试,我发现当OnMapReady方法调用我的ArrayList时,它尚未被填充。

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);

        kundenList = new ArrayList<>(); //
        db = FirebaseFirestore.getInstance();
        db.collection("Kunden").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {

                if(!queryDocumentSnapshots.isEmpty()){
                    List<DocumentSnapshot> list = queryDocumentSnapshots.getDocuments();

                    for(DocumentSnapshot d : list){
                        Kunde k = d.toObject(Kunde.class);
                        kundenList.add(k);//Here I fill my ArrayList with the values from the Database (Which Works as Intented)

                    }
                }
            }
        });

        map = findViewById(R.id.mapView);
        map.onCreate(mapViewBundle);
        map.getMapAsync(this);

    }

public void onMapReady(GoogleMap map) {

        map.setMyLocationEnabled(true);

        if(!kundenList.isEmpty()){ //Here is the Problem. My ArrayList is empty (size = 0) when the code reaches this point and only gets filled afterwards
        for(Kunde kunde : kundenList) {
            MarkerOptions options = markLocations(kunde.getLat(), kunde.getLng(), kunde.getName());
            map.addMarker(options);         
        }
        }
    }

我希望从数据库中检索到的每个位置都在地图上具有标记,但是我的代码不会添加任何标记,因为调用时ArrayList为空。

2 个答案:

答案 0 :(得分:0)

完成列表后,您可能希望手动调用onMapReady()...

for(DocumentSnapshot d : list){
    Kunde k = d.toObject(Kunde.class);
    kundenList.add(k);//Here I fill my ArrayList with the values from the Database (Which Works as Intented)

}

onMapReady(this.map);

这意味着onMapReady可能会连续两次被调用两次,但这对用户应该是透明的。

答案 1 :(得分:0)

我创建了一个新的方法callMap(),并在我的列表填充后调用它,这对我有用。

db.collection("Kunden").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {

                if(!queryDocumentSnapshots.isEmpty()){
                    List<DocumentSnapshot> list = queryDocumentSnapshots.getDocuments();

                    for(DocumentSnapshot d : list){
                        Kunde k = d.toObject(Kunde.class);
                        kundenList.add(k);
                    }
callMap();
                }
            }
        });

public void callMap(){
        map.getMapAsync(this);
    }