【问题标题】:Controlling marker visibility in real-time via Firebase通过 Firebase 实时控制标记可见性
【发布时间】:2018-03-04 09:26:07
【问题描述】:

所以我有学生显示在地图上,每个学生都有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

【问题讨论】:

  • 更新时,您如何检查要更新的学生标记?
  • 我不是,我希望他们都更新..!当我单击切换按钮时,数据库中所有子项中的值都会正确更新..!
  • 如果它已经这样做了,有什么问题?
  • UI 上的问题或读取值.. 假设所有学生在打开地图时都有 isShow false。当我将其更改为 true 时,所有学生标记都正常显示,但如果我将其更改回 false,即使值更改为 false,它们也不会隐藏。如果我关闭地图并再次打开它,它们将不会显示,因为它是错误的,但我希望这实时发生

标签: java android google-maps firebase firebase-realtime-database


【解决方案1】:

您必须在更新标记之前删除标记。创建一个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());
          }
        });
    }

【讨论】:

  • 我不能使用googleMap.clear(),因为它会清除所有内容,而且我还有其他已修复的标记,我不希望它们消失。!
  • 很高兴为您提供帮助
  • 假设我希望该列表中的一个标记在发生某些操作时隐藏。我设法使用存储在列表中的密钥正确更新了数据库中的 isShow 值。然后我从列表中删除了该标记。但它并没有实时隐藏。!我不得不关闭地图并再次打开它以刷新标记。!有什么建议吗?
  • @AlaaAbuZarifa 你可以发布另一个问题
【解决方案2】:

只是不要在 show == false 在您的 onChildChanged 方法上创建标记:

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))));
}

【讨论】:

  • 还是一样的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
  • 2014-02-24
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多