Удалить предыдущий маркер и сведения о маркере не удалось

У меня возникли проблемы с моим маркером, потому что каждый Latitudeраз, когда и Longitudeизменяется, он будет создавать новый маркер вместо переопределения старого. Я получаю несколько маркеров, поэтому я сохранил его внутри и ArrayList.
А также мой String busRouteи int passengerоказывается нулевым. Вот мой код. Я надеюсь, что кто-то сможет решить мою проблему.

private String name, busNum, busRoute, currentLocation, estimatedTime, availableSeat, lat, lng;
double latitude, longitude;
int passenger;

public void markerDriver() {
    markerArray = new ArrayList<>();
    Firebase ref = new Firebase(Config.FIREBASE_URL_DRIVER);
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.getChildrenCount() == 0) {
                markerInfo();
            } else {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    if (snapshot.child("availableSeat").exists() && snapshot.child("latitude").exists() && snapshot.child("longitude").exists() && snapshot.child("estimatedTime").exists()) {
                        name = snapshot.child("driversName").getValue().toString().trim();
                        busNum = snapshot.child("busNum").getValue().toString().trim();
                        lat = snapshot.child("latitude").getValue().toString().trim();
                        lng = snapshot.child("longitude").getValue().toString().trim();
                        availableSeat = snapshot.child("availableSeat").getValue().toString().trim();
                        estimatedTime = snapshot.child("estimatedTime").getValue().toString().trim();
                        latitude = Double.valueOf(lat);
                        longitude = Double.valueOf(lng);

                        convertLatLong();
                        getTotalPass();
                        markerArray.add(new Driver(name, busNum, busRoute, passenger, latitude, longitude, currentLocation, estimatedTime));
                    }
                }
                for (i = 0; i < markerArray.size(); i++) {
                    createMarker(markerArray.get(i).getDriversName(), markerArray.get(i).getBusNum(), markerArray.get(i).getRoute(), markerArray.get(i).getTotalPassenger(), markerArray.get(i).getLatitude(), markerArray.get(i).getLongitude(), markerArray.get(i).getLocation(), markerArray.get(i).getEstimatedTime());
                }
            }
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            Toast.makeText(MainMapActivity.this, "markerDriver: " + firebaseError.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });

public void convertLatLong() {
    Geocoder geocoder;
    List<android.location.Address> addresses;
    geocoder = new Geocoder(this, Locale.getDefault());

    try {
        addresses = geocoder.getFromLocation(latitude, longitude, 1);
        if (addresses.get(0).getAddressLine(0) != null) {
            currentLocation = addresses.get(0).getAddressLine(0) + ", " + addresses.get(0).getLocality();
        } else {
            currentLocation = addresses.get(0).getLocality();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void getTotalPass() {
    busRef = new Firebase(Config.FIREBASE_URL_BUSNUMBER);
    Query bus = busRef.orderByChild("busNum").equalTo(busNum);
    bus.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                passenger = Integer.valueOf(snapshot.child("capacity").getValue().toString().trim()) - Integer.valueOf(availableSeat);
                busRoute = snapshot.child("route").getValue().toString().trim();
                Toast.makeText(MainMapActivity.this, "routeGetTotalPass: " + busRoute + ":::" + passenger, Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            Toast.makeText(MainMapActivity.this, "getTotalPass: " + firebaseError.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

createMarker

protected void createMarker(String driversName, final String busNum, String route, final int totalPass, double latitude, double longitude, String location, String estimatedTime) {
    Marker marker = mMap.addMarker(new MarkerOptions()
            .position(new LatLng(latitude, longitude))
            .title(location)
            .snippet("Driver's Name: " + driversName + "nBus number: " + busNum + "nRoute: " + route + "nTotal Passenger: " + totalPass + "nEstimated time: " + estimatedTime));
    mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
        @Override
        public boolean onMarkerClick(com.google.android.gms.maps.model.Marker marker) {
            dialogInfo(marker);
            return true;
        }
    });
}

4 ответа

  1. Удалить старый маркер перед добавлением нового маркера

                       if (marker != null) {
                        marker.remove();
                        } 
                        convertLatLong();
                        getTotalPass();
                        markerArray.add(new Driver(name, busNum, busRoute, passenger, latitude, longitude, currentLocation, estimatedTime));
    

    другой способ-очистить GoogleMap перед добавлением нового маркера

    googleMap.clear();
    

    перед объявлением onCreate

    Маркер маркер;

    затем менять

     protected void createMarker(String driversName, final String busNum, String route, final int totalPass, double latitude, double longitude, String location, String estimatedTime) {
    marker = mMap.addMarker(new MarkerOptions()
            .position(new LatLng(latitude, longitude))
            .title(location)
            .snippet("Driver's Name: " + driversName + "\nBus number: " + busNum + "\nRoute: " + route + "\nTotal Passenger: " + totalPass + "\nEstimated time: " + estimatedTime));
    mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
        @Override
        public boolean onMarkerClick(com.google.android.gms.maps.model.Marker marker) {
            dialogInfo(marker);
            return true;
        }
    });
    }
    
  2. Сначала объявите список маркеров
    ArrayList<Marker> markerList=new ArrayList<>();

    затем измените метод create marker на

    protected void createMarker(String driversName, final String busNum, String route, final int totalPass, double latitude, double longitude, String location, String estimatedTime) {
        boolean isOld = false;
        for (Marker m:markerList) {
            if (m.getTitle().equals(location)) {
                m.setPosition(new LatLng(latitude, longitude));
                isOld=true;
                break;
            }
        }
        if (!isOld) {
            Marker marker = mMap.addMarker(new MarkerOptions()
                    .position(new LatLng(latitude, longitude))
                    .title(location)
                    .snippet("Driver's Name: " + driversName + "\nBus number: " + busNum + "\nRoute: " + route + "\nTotal Passenger: " + totalPass + "\nEstimated time: " + estimatedTime));
        markerList.add(marker);
        }
        mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(com.google.android.gms.maps.model.Marker marker) {
                dialogInfo(marker);
                return true;
            }
        });
    }
    

    это работает для меня

  3. Я сделал это со следующим кодом:

        final WeakHashMap<String,Marker> obj = new WeakHashMap<>();
    
        mRootRef.child("Coordinates/" + mRequestID)
        .addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
    
                Coordinates coordinates = dataSnapshot.getValue(Coordinates.class);
                final String lat = coordinates.getLatitude();
                final String lng = coordinates.getLongitude();
    
                latLng1 = new LatLng(Double.valueOf(lat), Double.valueOf(lng));
                markerOptions = new MarkerOptions()
                        .position(latLng1);
    
    
                mapa.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng1, 15));
                mapa.animateCamera(CameraUpdateFactory.zoomTo(15), 2000, null);
    
                Marker marker = mapa.addMarker( markerOptions);
                marker.setSnippet(dataSnapshot.getKey());
                marker.showInfoWindow();
    
                // Here is where I create the unique marker identification
                obj.put(dataSnapshot.getKey(), marker);
    
    
            }
    
            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
    
    
                  Coordinates coordinates = dataSnapshot.getValue(Coordinates.class);
             final String lat = coordinates.getLatitude();
             final String lng = coordinates.getLongitude();
    
             latLng1 = new LatLng(Double.valueOf(lat), Double.valueOf(lng));
             markerOptions = new MarkerOptions().position(latLng1);
    
             // Now, it's just needed to update its new position
             obj.get(dataSnapshot.getKey()).setPosition(latLng1);
    
             mapa.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng1, 15));
             mapa.animateCamera(CameraUpdateFactory.zoomTo(15), 2000, null);
    
    
            }
    
            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {
    
            }
    
            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {
    
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
    
            }
        });