隐藏列表中的一个标记是不行的

时间:2018-03-08 08:21:27

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

所以我在地图上有一堆标记,他们从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());
          }
        });
  }

1 个答案:

答案 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;
}