0

我遇到了问题,因为每当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; 
     } 
    }); 
} 
+0

你能证明你的createMarker方法呢? –

+0

@ArjunGurung请看我更新的问题。我已经把createMarker方法。 – tin

回答

0

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

,这是为我工作

+0

嗨阿琼,我存储'POJO'在我的标记阵列。正如你可以在上面的代码中看到的,我有一个POJO模型'驱动程序' – tin

+1

@tin我已经更新了答案... –

+0

嗨arjun,请给我示例代码如何在markerList中添加数据? – tin

0

删除旧的标记前添加新的标记

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

我已经尝试过'googleMap.clear();'但是没有返回任何标记 – tin

+0

发布完整代码 – sasikumar

+0

在您的代码中,每次创建新标记时都要更改标记标记是全局变量 – sasikumar

0

我用下面的代码做它:

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

     } 
    });