所以我在地图上有一堆标记,他们从firebase实时数据库中获取数据。我喜欢地图上的一个切换按钮,显示或隐藏所有标记,它工作正常。但是现在我想要特定标记在发生某些动作时隐藏,但它不起作用..!
真正发生的事情是..当我在该标记上触发一些操作时......它会在数据库上正常更新,但它并没有实时隐藏在地图上。 我不得不关闭地图并再次打开以查看更改..!
问题是什么..!?
守则
Marker studentMarker = null;
ArrayList<Marker> studentsMarkers = new ArrayList<>();
ArrayList<String> stdId = new ArrayList<>();
@Override
public void onChildChanged(DataSnapshot snapshot, String s) {
LatLng latLng = new LatLng(snapshot.getValue(TestUserStudent.class).getLat(),
snapshot.getValue(TestUserStudent.class).getLang());
boolean isShow = snapshot.getValue(TestUserStudent.class).isShow();
if (isShow) {
studentMarker = googleMap.addMarker(new MarkerOptions()
.position(latLng)
.title(snapshot.getValue(TestUserStudent.class).getName() + "")
.snippet(snapshot.getValue(TestUserStudent.class).getSection() + "")
.icon(BitmapDescriptorFactory.fromBitmap(
getMarkerBitmapFromView(snapshot.getValue(TestUserStudent.class).getImg(),
R.drawable.map_marker_red))));
studentsMarkers.add(studentMarker);
stdId.add(snapshot.getKey());
}
}
// this method called when I click on button inside the infowindow of a marker from the list and it updates the marker in the database correctly!
void onWindowInfoButtonClicked(Marker marker) {
for (int i = 0; i < studentsMarkers.size(); i++) {
if (marker.getId().equalsIgnoreCase(studentsMarkers.get(i).getId())) {
studentsMarkers.get(i).remove();
stdId.remove(i);
final String id = stdId.get(i);
HashMap<String, Object> result = new HashMap<>();
result.put("show", false);
FirebaseDatabase.getInstance().getReference().child("Students").child(id)
.updateChildren(result);
}
}
}
// I use this to either show or hide all markers.. and it works fine no problem here
void updateShowing(final boolean show) {
for (int i = 0; i < studentsMarkers.size(); i++) {
studentsMarkers.get(i).remove();
}
FirebaseDatabase.getInstance().getReference().child("Students")
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
for (DataSnapshot ds : snapshot.getChildren()) {
ds.child("show").getRef().setValue(show);
}
}
@Override
public void onCancelled(DatabaseError error) {
Toast.makeText(getActivity(), "" + error.getMessage(), Toast.LENGTH_SHORT).show();
Log.i("onCancelled: ", error.getDetails() + "\n " + error.getMessage());
}
});
}
答案 0 :(得分:0)
您应该在onWindowInfoButtonClicked()方法中执行此操作。将此行iloc
更改为studentsMarkers.get(i).remove();
。
另外,我不明白你的逻辑
studentsMarkers.get(i).setVisible(false);
您移除了stdId.remove(i);
final String id = stdId.get(i);
位置的商品,但是您尝试访问此位置i
的新商品并更新其价值?
您可以简化方法i
,如下所示。由于您已将目标Marker对象传递给此函数,因此无需遍历您的void onWindowInfoButtonClicked(Marker marker)
列表以取回Marker对象。
studentMarkers
上述方法只会隐藏标记但不会删除标记,因为标题是“隐藏”。
修改强>
您可以设置onMarkerClick(标记标记)而不是onWindowInfoButtonClicked(标记标记)。
void onWindowInfoButtonClicked(Marker marker) {
marker.setVisible(false);
String id = marker.getId();
HashMap<String, Object> result = new HashMap<>();
result.put("show", false);
FirebaseDatabase.getInstance().getReference().child("Students").child(id)
.updateChildren(result);
}
请记住将地图设置为侦听此侦听器
public boolean onMarkerClick(final Marker marker) {
marker.setVisible(false);
String id = marker.getId();
HashMap<String, Object> result = new HashMap<>();
result.put("show", false);
FirebaseDatabase.getInstance().getReference().child("Students").child(id)
.updateChildren(result);
return false;
}