добавление одного маркера на карту, Android, Google API - PullRequest
0 голосов
/ 11 апреля 2011

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

Я следовал инструкциям этого урока: http://developer.android.com/resources/tutorials/views/hello-mapview.html

И мой код выглядит так:

public class AppTwoAndroid extends MapActivity {
private Button refreshButton;
double lat, lon;
ConnectionHandler conhandler;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    MapView mapView = (MapView) findViewById(R.id.mapview);
    mapView.setBuiltInZoomControls(true);
    Log.i("AppTwo", "making connectionhandler object");
    conhandler = new ConnectionHandler();
    conhandler.execute();

    Log.i("AppTwo", "making button");
    this.refreshButton = (Button)this.findViewById(R.id.close);

    final List<Overlay> mapOverlays = mapView.getOverlays();
    Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
    final AppTwoAndroidItemizedOverlay itemizedoverlay = new AppTwoAndroidItemizedOverlay(drawable);

    refreshButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Log.i("AppTwo", "inside onclick");
            if (mapOverlays.contains(itemizedoverlay) == true) {
                mapOverlays.remove(itemizedoverlay);
            }
            conhandler.write();
            lat = conhandler.retLat();
            lon = conhandler.retLon();
            lat = lat * 1e6;
            lon = lon * 1e6;
            int ilat = (int) lat;
            int ilon = (int) lon;
            GeoPoint point = new GeoPoint(ilat ,ilon);
            OverlayItem overlayitem = new OverlayItem(point, null, "AppOne");
            itemizedoverlay.addOverlay(overlayitem);
            mapOverlays.add(itemizedoverlay);


            Toast.makeText(getBaseContext(), "lat is: " + lat + " lon is: " + lon
                    ,  Toast.LENGTH_SHORT).show();

            }
    });
}
@Override
     protected boolean isRouteDisplayed() {
        // TODO Auto-generated method stub
        return false;
    }
}

и мой класс AppTwoAndroidItemizedOverlay:

public class AppTwoAndroidItemizedOverlay extends ItemizedOverlay {

private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
Context mContext;

public AppTwoAndroidItemizedOverlay(Drawable defaultMarker) {
    super(boundCenterBottom(defaultMarker));
    // TODO Auto-generated constructor stub
}

@Override
protected boolean onTap(int index) {
  OverlayItem item = mOverlays.get(index);
  AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
  dialog.setTitle(item.getTitle());
  dialog.setMessage(item.getSnippet());
  dialog.show();
  return true;
}

public AppTwoAndroidItemizedOverlay(Drawable defaultMarker, Context context) {
      super(defaultMarker);
      mContext = context;
}

public void addOverlay(OverlayItem overlay) {
    mOverlays.add(overlay);
    populate();
}

@Override
protected OverlayItem createItem(int i) {
  return mOverlays.get(i);
}

@Override
public int size() {
  return mOverlays.size();
}

}

Ответы [ 3 ]

0 голосов
/ 12 апреля 2011

В методе onClick просто задайте

mapOverlays.clear ();

, это должно очистить все существующие маркеры.

Надеюсь, это работает:)

0 голосов
/ 06 мая 2017

Добавьте этот оператор перед кодом ....

mMap.clear ();

    mMap.clear();

    LatLng latLng = new LatLng(gps.getLatitude(),  gps.getLongitude());
    mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new 
    LatLng(gps.getLatitude(),  gps.getLongitude()), 15));
    mMap.addMarker(new MarkerOptions().position(latLng).title(""));
    mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
0 голосов
/ 11 апреля 2011

В этой части кода:

   if (mapOverlays.contains(itemizedoverlay) == true) {
        mapOverlays.remove(itemizedoverlay);
    }

Когда вы удаляете Overlay из структуры mapOverlay, вы на самом деле не очищаете оверлей, поэтому, когда вы добавляете другой элемент и повторно добавляете его в mapOverlay, будет 2 маркера.

Если вы просто хотите, чтобы один маркер сделал Overlay с setOverlayItem вместо списка с логикой добавления. (имеется в виду наложение только с элементом, который при добавлении другого просто заменяет старый)

Надеюсь, это помогло! : D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...