2

Ich füge ein paar (2-13) Markierungen auf der Karte hinzu. Die Markierungen werden nicht alle gleichzeitig hinzugefügt, stattdessen wird die Datenänderung von Firebase abgehört. Wenn ein neuer Benutzer hinzugefügt wurde, wird eine Markierung mit seinem Standort auf der Karte hinzugefügt.Fehler beim Entfernen des Markers aus einem Array von Markern sowie aus Map, nachdem der Titel der Markers mit aus FirebaseDatabase abgerufenen Strings verglichen wurde

Hier ist, wie:

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); 
     } 
} 

Hier ist, wie nP, cLatP und cLngP sind Werte bekommen, die ihnen zugewiesen und auch, wie ich versuche, die Markierung zu entfernen:

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

         } 

        } 
        ... 
       }); 

Meine Logik/Algorithmus: Hier unten bin ich versuche, die pName zur Verfügung zu bekommen und versuchen, es mit verfügbaren pMarker Titel zu vergleichen, wenn es übereinstimmt dann sollte pMarker nicht entfernt werden und wenn keine Zeichenkette gleich pMarker s Titel ist, dann sollte dieser Marker entfernt werden.

Hier ist, was Datenstruktur wie folgt aussieht:

-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 

Das Problem ist, dass anstelle des deren Titel in ArrayList<String> pA verfügbar einem der Strings nicht gleich ist, die der Marker in neueste aufgenommen wird immer entfernt!

So, wie zu entfernen Sie die Markierung, deren Titel ist nicht gleich einer der verfügbaren Zeichenfolge in ?

Bitte verzeihen Sie mir für nicht so klare Frage, aber ich habe es auf die beste Weise beschrieben, die ich kann. Ich würde es wirklich schätzen, wenn Sie mir einen besseren und einfacheren Weg geben können, um das zu erreichen, was ich hier möchte.

+0

in Ihrem Code Sie die Markierung entfernen, wenn der Titel zu einem des Strings aus pA nicht gleich ist. Das heißt, um nicht entfernt zu werden, müsste es allen Strings –

Antwort

3

Sie müssen tatsächlich zuerst die gesamte Titelliste ausfüllen und dann über alle Markierungen iterieren.

Überprüfen Sie dann, während Sie über die Marker iterieren, ob die Titelliste den Titel des Markers enthält. Wenn nicht, entferne es.

sollte diese Arbeit:

// 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

gleich sein, vielen Dank! Kannst du bitte auch hier einen Blick darauf werfen: http://stackoverflow.com/q/41993441/6144372 –

+0

kann ich hier Hilfe bei einer verwandten Frage bekommen: http://stackoverflow.com/q/42252017/6144372 –

Verwandte Themen