需要从Firebase检索每个特定事件的Latitude
和Longitude
,其中用户在创建en事件时也会通过在特定位置设置标记来选择事件位置(Latitude
和Longitude
(。
我遇到的问题是,保存的最后一个事件会覆盖所有其他现有的事件位置,因此当您点击TextView
将您带到GoogleMaps
以显示事件将在哪里发生时,只有最后一个事件的位置保存。但显然每个事件都有其特定的位置。
例如,如果我创建了三个事件,并且它们的位置是罗马、柏林和莫斯科,则GoogleMap
上创建的唯一标记将是莫斯科的事件,因为这是保存的最后一个位置。
我希望当第二个用户使用每个特定于事件postid
击中TextView
时,该事件可以在数据库中找到,并在地图上显示其特定坐标。有人可以帮助我实现这一目标吗?我一直在尝试通过datasnapshot
实现这一目标,但我无法找到其他活动地点。我总是为所有帖子保存最后一个事件的位置。有没有比datasnapshot
更好的方法?
下图希望有助于弄清楚我的数据结构是如何组织的。
火碱数据结构
地图活动用户.java
public class MapsActivityUser extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap map;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps_user);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
map = googleMap;
final DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Posts");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
Post post = snapshot.getValue(Post.class);
if (post != null) {
double latitude = post.getLocation().getLatitude();
double longitude = post.getLocation().getLongitude();
LatLng location = new LatLng(latitude, longitude);
map.addMarker(new MarkerOptions().position(location).title("Event location"));
map.moveCamera(CameraUpdateFactory.newLatLngZoom(location, 10));
} else {
Toast.makeText(MapsActivityUser.this, "Event doesn't have location on Map", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
代码中的问题是使用以下代码行:
map.moveCamera(CameraUpdateFactory.newLatLngZoom(location, 10));
在 for 循环中,这基本上意味着您的相机将被移动到循环中迭代的最后一个位置。但是,如果您增加缩放比例,您将能够在地图上看到所有位置。根据你最后的评论:
我怎样才能使它只出现该特定事件位置的标记而其他事件没有?
在这种情况下,应使用查询。基本上,您将告诉 Firebase 仅返回与您的查询匹配的单个位置。这应该看起来像这样:
Query query = reference.orderByChild("locationName").equalTo("locationName");
现在,只需在此query
上附加一个侦听器并在地图上添加标记即可。在这种情况下,建议将相机移动到该位置,因为您只能获得一个位置。但请注意,如果您有唯一的位置名称,则此查询将起作用。如果还存储位置的 ID,则只能使用如下所示的DatabaseReference
:
DatabaseReference locationRef = reference.child(locationId);
附加侦听器并在地图上添加标记。
编辑:
要获取纬度和经度,请使用以下代码行:
Query query = reference.orderByChild("postid").equalTo("-LzNDAXtnT6NXYK2XYPK");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
double latitude = ds.child("location").child("latitude").getValue(Double.class);
double longitude = ds.child("location").child("longitude").getValue(Double.class);
Log.d(TAG, latitude + ", " + longitude);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
};
query.addListenerForSingleValueEvent(valueEventListener);
侦听集合回调(查询快照(, 在回调运行forloop中,您将获得DocumentChanges类,您将在其中添加,删除,修改指示器,指示何时添加,删除和修改数据,相应地执行您的逻辑。 若要获取文档,请使用 getId,它将返回集合中存在的所有文档 ID。 我不在电脑前面,只是检查谷歌。
我将尽快编辑解决方案。