删除之前的标记和标记的信息失败

Remove previous marker and marker's info failed

我的标记有问题,因为每次 LatitudeLongitude 更改时,它都会创建一个新标记而不是覆盖旧标记。我正在获取多个标记,所以我将其存储在 ArrayList 中。 而且我的 String busRouteint 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;
        }
    });
}

在添加新标记之前删除旧标记

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

首先声明一个标记列表 ArrayList<Marker> markerList=new ArrayList<>(); 然后将创建标记的方法更改为

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

这对我有用

如果你想删除特定的标记,然后使用带有整数作为 id 和标记对象的 weakhash 映射,然后你可以根据索引 id 将其删除。

有关更多信息,请查看此 -

我用下面的代码做到了:

    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) {

        }
    });