2

Я добавляю несколько (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?

Пожалуйста, простите меня за не столь ясный вопрос, но я описал его наилучшим образом. Я был бы очень признателен, если бы вы могли дать мне лучший и простой способ достичь того, чего я хочу здесь.

+0

В коде, вы удалите маркер, если его название не равно ни одному из строк мкА. То есть, чтобы его не удаляли, он должен был бы быть равен всем строкам –

ответ

3

Вам нужно сначала заполнить весь список названий, а затем перебрать все маркеры.

Затем, повторяя маркеры, проверьте, содержит ли заголовок заголовок маркера. Если нет, удалите его.

Это должно работать:

// 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(); 
    } 
    } 
} 
+0

, благодаря большому человеку! не могли бы вы также взглянуть сюда: http://stackoverflow.com/q/41993441/6144372 –

+0

могу ли я получить некоторую помощь здесь по соответствующему вопросу: http://stackoverflow.com/q/42252017/6144372 –