2015-07-11 2 views
1

Я пытаюсь обновить местоположение маркера в карте Google, которую я получаю в качестве ответа с сервера. Я храню маркер и table_id в HashMap для отслеживания маркера на карте, но при текущем состоянии новый маркер всегда создается в update the Location, не удаляя старый. Может ли кто-нибудь увидеть, что я делаю неправильно?Удалите определенный маркер с карты Google, прежде чем обновлять местоположение.

Я заметил, что это просто работает для первого обновления после того, как новый всегда создается.

Код

public class Map extends FragmentActivity implements OnMapReadyCallback { 
    GoogleMap map; 
    Marker marker; 
    HashMap<Integer, Marker> markerMap = new HashMap<Integer, Marker>(); 

     private void gotoLocation(int id, double lat, double lng, 
       String route_direct) { 

      final float zoom = 11; 

      LatLng ll = null; 

      if (markerMap.containsKey(id)) { 
       // Update the location. 
       marker = markerMap.get(id); 
       marker.remove(); 

       ll = new LatLng(lat, lng); 
       if (lat != 0 && lng != 0 && !route_direct.isEmpty()) { 
        MarkerOptions markerOpt = new MarkerOptions() 
          .title(route_direct).position(ll).visible(true); 
        marker = map.addMarker(markerOpt); 
        CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll, 
          zoom); 
        map.moveCamera(update); 
       } 

      } else { 

       ll = new LatLng(lat, lng); 
       if (lat != 0 && lng != 0 && !route_direct.isEmpty()) { 
        MarkerOptions markerOpt = new MarkerOptions() 
          .title(route_direct).position(ll).visible(true); 
        marker = map.addMarker(markerOpt); 
        markerMap.put(id, marker); 

        CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll, 
          zoom); 
        map.moveCamera(update); 
       } 

      } 

     } 
} 

Скриншот enter image description here

+0

@ DanielNugent: идентификатор table_id из базы данных таблицы. Я не могу утверждать, почему он работает только для первого обновления, а затем создается новый маркер! – MrPencil

+0

Я отлаживал его раньше, и он попадает в заявление if. Я попробую еще раз и уведомит вас. – MrPencil

+0

@ DanielNugent: Я пробовал, и условие вводится все время, но оно просто работает для первого обновления. Да, я удалил строки 'getMapAsync', я поместил их там для тестирования. У меня есть они в 'onCreate' – MrPencil

ответ

1

После выполнения кода, я понял, где проблема. В случае, когда маркер уже существует в HashMap, вы не обновляете запись в HashMap с помощью новой ссылки Marker.

Итак, в случае, если он уже существует, просто удалите старую запись маркера из HashMap и добавьте новую ссылку Marker с тем же ключом.

всего две строки кода добавил с //added в комментариях:

private void gotoLocation(int id, double lat, double lng, 
          String route_direct) { 

    final float zoom = 11; 

    LatLng ll = null; 

    if (markerMap.containsKey(id)) { 

     // Update the location. 
     marker = markerMap.get(id); 
     marker.remove(); 
     markerMap.remove(id); //added 

     ll = new LatLng(lat, lng); 
     if (lat != 0 && lng != 0 && !route_direct.isEmpty()) { 
      MarkerOptions markerOpt = new MarkerOptions() 
        .title(route_direct).position(ll).visible(true); 
      marker = mMap.addMarker(markerOpt); 
      markerMap.put(id, marker); //added 
      CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll, 
        zoom); 
      mMap.moveCamera(update); 
     } 

    } else { 

     ll = new LatLng(lat, lng); 
     if (lat != 0 && lng != 0 && !route_direct.isEmpty()) { 
      MarkerOptions markerOpt = new MarkerOptions() 
        .title(route_direct).position(ll).visible(true); 
      marker = mMap.addMarker(markerOpt); 
      markerMap.put(id, marker); 

      CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll, 
        zoom); 
      mMap.moveCamera(update); 
     } 

    } 

} 

Кроме того, здесь, как я создал простой тест, только тестирование с одним id, и обновлять его на каждой карте нажмите:

mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() { 

     @Override 
     public void onMapClick(LatLng point) { 

      Log.d("MyMap", "MapClick"); 

      gotoLocation(1, point.latitude, point.longitude, "testing"); 
     } 
    }); 
+0

Есть ли объяснения этого поведения в добавочной части (else block), когда я добавляю новый маршрут в мою таблицу шин с тем же выбранным, новый признанный идентификатор маршрута распознается, а Блок 'else' вводится после того, как маркер добавляется в HashMap, но не отображается на карте. – MrPencil

+0

Кроме того, когда новый ответ снова возвращается к методу, я заметил, что последний добавленный маркер с новым идентификатором не находится в HashMap, и он просто содержит элементы первого запроса также, когда запрос завершен, и новый добавленный элемент остается в HashMap для запроса LifeCycle! – MrPencil

Смежные вопросы