将标记的标题与从 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);
}
}
以下是 nP
、cLatP
和 cLngP
如何获取分配给它们的值以及我如何尝试删除标记:
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 不应该被删除,如果没有字符串等于 pMarker
s 的标题,那么这个标记应该被删除。
这是数据结构的样子:
-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();
}
}
}
我要在地图上添加几个 (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);
}
}
以下是 nP
、cLatP
和 cLngP
如何获取分配给它们的值以及我如何尝试删除标记:
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 不应该被删除,如果没有字符串等于 pMarker
s 的标题,那么这个标记应该被删除。
这是数据结构的样子:
-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();
}
}
}