【问题标题】:Remove previous marker and marker's info failed删除以前的标记和标记的信息失败
【发布时间】:2017-02-10 23:27:15
【问题描述】:

我的标记有问题,因为每次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();
        }
    });
}

创建标记

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

【问题讨论】:

  • 你也可以展示你的 createMarker 方法吗?
  • @ArjunGurung 请查看我更新的问题。我已经放了createMarker方法。

标签: android google-maps firebase firebase-realtime-database google-maps-markers


【解决方案1】:

首先声明一个标记列表 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;
        }
    });
}

这对我有用

【讨论】:

  • 嗨,arjun,我在我的 markerArray 上存储了一个 POJO。正如您在上面的代码中看到的,我有一个 POJO 模型 Driver
  • 嗨,arjun,你能给我一些关于如何在该 markerList 中添加数据的示例代码吗?
  • @tin 在我的 createMarker 方法中,如果有现有标记,它将更新,否则创建一个新的。只有用我的代码更改你的代码才能完成你的工作
【解决方案2】:

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

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

【讨论】:

  • 我已经尝试过googleMap.clear();,但没有返回任何标记
  • 每次创建新标记时都在代码中更改标记标记为全局变量
  • 对不起,我不明白
【解决方案3】:

如果你想删除特定的标记,那么使用以整数为 id 和标记对象的弱哈希映射,那么你可以根据索引 id 将其删除。

更多信息请查看 - https://stackoverflow.com/a/35363423/2128166

【讨论】:

    【解决方案4】:

    我用下面的代码做到了:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      • 1970-01-01
      • 2013-06-27
      相关资源
      最近更新 更多