0

我正在使用firebase和google api来制作我已经存储在Firebase中的某些坐标的热图。我的问题是,当我制作热图时,来自Firebase的数据尚未加载,因此Content Provider发送异常,因为我没有发送它的内容。如何让热图等待列表满了为止?我附上代码:如何让热图等待firebase数据? Android

public void addHeatMap() 
{ 
    List<LatLng> list = null; 

    // Get the data: latitude/longitude. 

     list = readItems(); 

    // Create a heat map tile provider, passing it the latlngs 


    mProvider = new HeatmapTileProvider.Builder() 
      .data(list) 
      .build(); 
    // Add a tile overlay to the map, using the heat map tile provider. 
    mOverlay = gmap.addTileOverlay(new TileOverlayOptions().tileProvider(mProvider)); 
} 


public ArrayList<LatLng> readItems() 
{ 

    mDatabaseReference.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      // listas.clear(); 
      for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) { 
       Alertas al = postSnapshot.getValue(Alertas.class); 
       LatLng latt= new LatLng(al.getLat(),al.getLongi()); 
       listas.add(latt); 
       System.out.println("This are coordinates"+ latt.toString()); 
       Log.wtf("Message", "This too: "+latt.toString()); 

      } 
      Log.wtf("List is this", listas.toString()); 


     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

    return listas; 

} 

回答

1

把这个代码,并将其移动到您的onDataChange函数的末尾:

mProvider = new HeatmapTileProvider.Builder() 
      .data(listas) 
      .build(); 
    // Add a tile overlay to the map, using the heat map tile provider. 
    mOverlay = gmap.addTileOverlay(new TileOverlayOptions().tileProvider(mProvider)); 

这样,它不会运行,直到火力地堡返回数据。

另请注意,我将传递给heatmap构建器内的data()方法的变量更改为“listas”,以便它与用于容纳Firebase数据的变量相匹配。

最后,你不应该从readItems()返回任何值。如您所见,该功能将在Firebase返回数据之前完成执行,因此它将始终返回未更改的列表。

+0

非常感谢!我感到愚蠢,这是愚蠢的错误 – user3487815