Я добавляю несколько (2-13) маркеров на карте. Маркеры не добавляются сразу, но вместо этого изменение данных прослушивается с Firebase
, и если новый пользователь был добавлен, маркер с его местоположением будет добавлен на карту.Невозможно удалить маркер из массива маркеров, а также из карты после сравнения названия маркеров со строками, полученными из FirebaseDatabase
Вот как:
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();
}
}
}
}
}
}
...
});
Моя логика/алгоритм: Внизу вот я пытаюсь получить доступный 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
, маркер, который был добавлен в последний становится удален!
Итак, Как с удалить маркер, чей заголовок не равен ни одной строке, доступной в ArrayList<String> pA
?
Пожалуйста, простите меня за не столь ясный вопрос, но я описал его наилучшим образом. Я был бы очень признателен, если бы вы могли дать мне лучший и простой способ достичь того, чего я хочу здесь.
В коде, вы удалите маркер, если его название не равно ни одному из строк мкА. То есть, чтобы его не удаляли, он должен был бы быть равен всем строкам –