将标记的标题与从 FirebaseDatabase 获取的字符串进行比较后,无法从标记数组和地图中删除标记

Unable to remove marker from an array of markers as well as from Map after comparing the markers' title with strings fetched from FirebaseDatabase

我要在地图上添加几个 (2-13) 个标记。标记不会一次全部添加,而是从 Firebase 监听数据更改,如果添加了新用户,则会在地图上添加一个带有他所在位置的标记。

方法如下:

public void addMarkers() {
        mMap.clear();
        vMarker = mMap.addMarker(new MarkerOptions().position(new LatLng(Double.parseDouble(vLat), Double.parseDouble(vLng))).title("Title" + v.trim()).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)));
        markersList.add(venueMarker);
        for (int i=0; i<nP.size(); i++) {
            pMarker = mMap.addMarker(new MarkerOptions().position(new LatLng(Double.valueOf(cLatP.get(i)), Double.valueOf(cLngP.get(i)))).title(nP.get(i).trim()).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
            markersList.add(pMarker);
        }
}

以下是 nPcLatPcLngP 如何获取分配给它们的值以及我如何尝试删除标记:

    aReference.child(rID).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if (dataSnapshot.getValue() != null) {
                            aReference.child(rID).child(key).addListenerForSingleValueEvent(new ValueEventListener() {
                                @Override
                                public void onDataChange(DataSnapshot dataSnapshot) {

                                    if (dataSnapshot.getValue() != null) {

                                        if (dataSnapshot.hasChild("pName") && dataSnapshot.hasChild("currentLat") && dataSnapshot.hasChild("currentLng")) {
                                            Map<String, String> map = (Map<String, String>) dataSnapshot.getValue();                                             
                                            nP.add(map.get("pName"));
                                            cLatP.add(map.get("currentLat").trim());
                                            cLngP.add(map.get("currentLng").trim());
                                            mMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
                                                @Override
                                                public void onMapLoaded() {
                                                    addMarkers();
                                                    mMap.getUiSettings().setZoomControlsEnabled(true);
                                                    mMap.getUiSettings().setMapToolbarEnabled(true);
                                                    mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
                                                    mMap.setMaxZoomPreference(19.0f);
                                                    mMap.setMyLocationEnabled(true);
                                                }
                                            });

                                        }

                                    } 

                                }
                                ...
                            });

                            if (pA != null) {
                                pA.clear();
                            }
                            // below is how I'm trying to remove markers
                            for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
                                Map<String, String> map = (Map<String, String>) childSnapshot.getValue();
                                pA.add(map.get("pName"));
                                if (markersList.size() > 0) {
                                    for (int i = 0; i < pA.size(); i++) {
                                        if (!pMarker.getTitle().equals(pA.get(i))) {
                                            pMarker.remove();
                                        }
                                    }
                                } 
                            }

                        }

                    }
                    ...
                });

我的 logic/algorithm:下面是我正在尝试获取可用的 pName 并尝试将其与可用的 pMarker 相匹配的标题,如果它匹配,那么 pMarker 不应该被删除,如果没有字符串等于 pMarkers 的标题,那么这个标记应该被删除。

这是数据结构的样子:

-app
  -child
    -rID
      -uniqueID1
        -userID1
          -key: value
          -key: value
          -pName: value1
          -currentLat: value1
          -currentLng: value1
      -uniqueID2
        -userID2
          -key: value
          -key: value
          -pName: value2
          -currentLat: value2
          -currentLng: value2
      -uniqueID3
        -userID3
          -key: value
          -key: value
          -pName: value2
          -currentLat: value2
          -currentLng: value2

问题是,而不是标题不等于 ArrayList<String> pA 中任何可用字符串的 marker,添加的标记最新的正在删除!

那么,如何 删除标题不等于 ArrayList<String> pA 中任何可用字符串的标记?

请原谅我的问题不是很清楚,但我已经尽力描述过了。如果你能给我一个更好更简单的方法来实现我在这里想要的,我将不胜感激。

您实际上需要先填充整个标题列表,然后遍历所有标记。

然后,在遍历标记时,检查标题列表是否包含标记的标题。如果没有,请将其删除。

这应该有效:

// below is how I'm trying to remove markers
// First, populate the title list
for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
  Map<String, String> map = (Map<String, String>) childSnapshot.getValue();
  pA.add(map.get("pName"));
}

// Then, iterate through the Markers
// Remove the Markers whose title is not contained in the title list
if (markersList.size() > 0) {
  for (int i = 0; i < markersList.size(); i++) {
    Marker m = markersList.get(i);
    if (!pA.contains(m.getTitle())) {
        m.remove();
    }
  }
}