所以我让学生在地图上显示,每个学生都有show
布尔值。我正在使用此值来确定标记是否应使用setVisible()
方法显示在地图上。!
我有一个开关按钮,它通过更新show
实时数据库中的值来显示和隐藏标记,但它并不总是有效。
问题是,当值设置为false
=> 时,标记不会隐藏!!,但是当它变成时,true
它们就会出现!?标记隐藏的唯一方法是如果我关闭地图然后再次打开它,这当然不是任何人想要的。!
有什么建议。!?
我如何显示标记
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference refStudents = database.getReference("Students");
refStudents.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot snapshot, String s) {
}
@Override
public void onChildChanged(DataSnapshot snapshot, String s) {
LatLng latLng = new LatLng(snapshot.getValue(TestUserStudent.class).getLat(),
snapshot.getValue(TestUserStudent.class).getLang());
boolean show = snapshot.getValue(TestUserStudent.class).isShow();
studentMarker = googleMap.addMarker(new MarkerOptions()
.position(latLng)
.title(item.getValue(TestUserStudent.class).getName() + "")
.snippet(item.getValue(TestUserStudent.class).getSection() + "")
.icon(BitmapDescriptorFactory.fromBitmap(
getMarkerBitmapFromView(item.getValue(TestUserStudent.class)
.getImg(), R.drawable.redMarker))));
if (show) {
studentMarker.setVisible(true);
}else {
studentMarker.setVisible(false);
}
}
@Override
public void onChildRemoved(DataSnapshot snapshot) {
}
@Override
public void onChildMoved(DataSnapshot snapshot, String s) {
}
@Override
public void onCancelled(DatabaseError error) {
}
});
我如何更新标记
private void updateShowing(final boolean isShow) {
FirebaseDatabase.getInstance().getReference().child("Students")
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
for (DataSnapshot ds : snapshot.getChildren()) {
ds.child("show").getRef().setValue(isShow);
}
}
@Override
public void onCancelled(DatabaseError error) {
Log.i( "onCancelled: ", error.getDetails() +"\n "+ error.getMessage());
}
});
}
TestUserStudent.class
public class TestUserStudent {
boolean show;
//other attributes
public boolean isShow() { return show; }
public void setShow(boolean show) { this.show = show; }
//other setters & getters
}
Firebase rtd
您必须在更新标记之前删除标记。创建一个ArrayList
以保存Markers
引用。
ArrayList<Marker> studentMarkersList=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 show = snapshot.getValue(TestUserStudent.class).isShow();
if(show)
{
studentMarker = googleMap.addMarker(new MarkerOptions()
.position(latLng)
.title(item.getValue(TestUserStudent.class).getName() + "")
.snippet(item.getValue(TestUserStudent.class).getSection() + "")
.icon(BitmapDescriptorFactory.fromBitmap(
getMarkerBitmapFromView(item.getValue(TestUserStudent.class)
.getImg(), R.drawable.redMarker))));
studentMarkersList.add(studentMarker);
}
}
然后定义一个方法来删除标记:
private void removeStudentMarkers()
{
for(int i=0;i<studentMakersList.size();i++)
{
studentMarkersList.get(i).remove();
}
}
最后这样做:
private void updateShowing(final boolean isShow) {
removeStudentMarkers();
FirebaseDatabase.getInstance().getReference().child("Students")
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
for (DataSnapshot ds : snapshot.getChildren()) {
ds.child("show").getRef().setValue(isShow);
}
}
@Override
public void onCancelled(DatabaseError error) {
Log.i( "onCancelled: ", error.getDetails() +"\n "+ error.getMessage());
}
});
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句