I use the following code:

MapView map; LocationManager LM; StringBuilder sbGPS = new StringBuilder(); private Timer mTimer; private MyTimerTask mMyTimerTask; DefaultResourceProxyImpl ResProxy; ArrayList<OverlayItem> items; Overlay currentOverlay; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); GPSloc = (TextView)findViewById(R.id.GPSloc); map = (MapView)findViewById(R.id.map); LM = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); mTimer = new Timer(); mMyTimerTask = new MyTimerTask(); mTimer.schedule(mMyTimerTask, 0, 1000); items = new ArrayList<OverlayItem>(); ResProxy = new DefaultResourceProxyImpl(getApplicationContext()); MC = map.getController(); map.setTileSource(new XYTileSource("xUSSR.Roads.Visicom 2.0",null, 14, 19, 256, ".jpg", new String[] {})); map.setClickable(true); map.setUseDataConnection(false); map.setMaxZoomLevel(19); map.setMinZoomLevel(14); MC.setZoom(16); map.setBuiltInZoomControls(false); map.setMultiTouchControls(false); GeoPoint startPoint = new GeoPoint(47.990554, 37.800179); MC.setCenter(startPoint); MC.animateTo(startPoint); public LocationListener location = new LocationListener() { @Override public void onLocationChanged(Location location) { lat = location.getLatitude(); lon = location.getLongitude(); GeoPoint point = new GeoPoint(lat, lon); OverlayItem myLocation = new OverlayItem(null, null, point); Drawable myMarker = map.getResources().getDrawable(R.drawable.human); myLocation.setMarker(myMarker); items.add(0, myLocation); } @Override public void onProviderDisabled(String provider) { checkEnabled(); } @Override public void onProviderEnabled(String provider) { checkEnabled(); } @Override public void onStatusChanged(String provider, int status, Bundle extras) {} }; class MyTimerTask extends TimerTask { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { TimeCount = TimeCount +1; if (TimeCount == 1 * 60){ GeoPoint task = new GeoPoint(47.990381, 37.799492); OverlayItem TaskItem = new OverlayItem(null, null, task); Drawable TaskMarker = map.getResources().getDrawable(R.drawable.target_monstr); TaskItem.setMarker(TaskMarker); items.add(1, TaskItem); } if (TimeCount == 2 * 60){ GeoPoint human = new GeoPoint(47.987854, 37.798934); OverlayItem TaskHumanItem = new OverlayItem(null, null, human); Drawable TaskHumanMarker = map.getResources().getDrawable(R.drawable.target_human); TaskHumanItem.setMarker(TaskHumanMarker); items.add(2, TaskHumanItem); } AddMerker(); }); } } public void AddMerker (){ if (!items.isEmpty()){ currentOverlay = new ItemizedIconOverlay<OverlayItem>(items, new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() { public boolean onItemSingleTapUp(final int index, final OverlayItem item) { return true; } public boolean onItemLongPress(final int index, final OverlayItem item) { return false; } }, ResProxy); map.getOverlays().add(currentOverlay); map.invalidate(); } } 

I get a crash when adding any marker. What is the trouble? What's wrong?

    1 answer 1

    The problem was in the lists and substitution of elements. To create an empty marker that replaces the marker in the ArrayList, an empty (transparent) pust layer was created in PaintNET. The zero marker looks like this:

     GeoPoint point = new GeoPoint(0, 0); NullItem = new OverlayItem(null, null, point); Drawable Marker = map.getResources().getDrawable(R.drawable.pust); NullItem.setMarker(Marker); 

    The working code, which allows adding and removing any marker at any time, began to look like this:

     double lat = 0; double lon = 0; MapView map; LocationManager LM; StringBuilder sbGPS = new StringBuilder(); private Timer mTimer; private MyTimerTask mMyTimerTask; DefaultResourceProxyImpl ResProxy; ArrayList<OverlayItem> items; ArrayList<OverlayItem> subItems; // Дополнительный список Overlay currentOverlay; OverlayItem NullItem; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); GPSloc = (TextView)findViewById(R.id.GPSloc); map = (MapView)findViewById(R.id.map); LM = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); mTimer = new Timer(); mMyTimerTask = new MyTimerTask(); mTimer.schedule(mMyTimerTask, 0, 1000); items = new ArrayList<OverlayItem>(); subItems = new ArrayList<OverlayItem>(); // Нулевой маркер GeoPoint point = new GeoPoint(0, 0); NullItem = new OverlayItem(null, null, point); Drawable Marker = map.getResources().getDrawable(R.drawable.pust); NullItem.setMarker(Marker); // subItems.add(0, NullItem); ResProxy = new DefaultResourceProxyImpl(getApplicationContext()); MC = map.getController(); map.setTileSource(new XYTileSource("xUSSR.Roads.Visicom 2.0",null, 14, 19, 256, ".jpg", new String[] {})); map.setClickable(true); map.setUseDataConnection(false); map.setMaxZoomLevel(19); map.setMinZoomLevel(14); MC.setZoom(16); map.setBuiltInZoomControls(true); map.setMultiTouchControls(false); GeoPoint startPoint = new GeoPoint(47.990554, 37.800179); MC.setCenter(startPoint); MC.animateTo(startPoint); public LocationListener location = new LocationListener() { @Override public void onLocationChanged(Location location) { lat = location.getLatitude(); lon = location.getLongitude(); } @Override public void onProviderDisabled(String provider) { checkEnabled(); } @Override public void onProviderEnabled(String provider) { checkEnabled(); } @Override public void onStatusChanged(String provider, int status, Bundle extras) {} }; class MyTimerTask extends TimerTask { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { // Здесь может быть прочий код исполняемый при работе таймера Markers(); }); } } public void Markers(){ if (!items.isEmpty()){ items.clear(); // Очистка списка, у меня только так удаляются все маркеры } if (lat == 0){ // Если GPS еще не дал координат items.add(0, NullItem); // добавится нулевой маркер } else { GeoPoint point = new GeoPoint(lat, lon); OverlayItem myLocation = new OverlayItem(null, null, point); Drawable myMarker = map.getResources().getDrawable(R.drawable.human); myLocation.setMarker(myMarker); items.add(myLocation); } // Добавляем все маркеры из дополнительного списка if (!tasks.isEmpty()){ for (int i = 1; i<tasks.size(); i++){ // Начинаем добавлять с 1 т.к. 0 уже занят items.add(i, tasks.get(i)); } } currentOverlay = new ItemizedIconOverlay<OverlayItem>(items, new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() { public boolean onItemSingleTapUp(final int index, final OverlayItem item) { Toast.makeText(getApplicationContext(), item.getTitle(),Toast.LENGTH_SHORT).show(); // Показывает название маркера если оно задано return true; } public boolean onItemLongPress(final int index, final OverlayItem item) { return true; } }, ResProxy); map.getOverlays().clear(); // У меня слой не очищается map.getOverlays().add(currentOverlay); map.invalidate(); } // Добавлятор маркеров private void addMarkers (String Txt, double tLat, double tLon){ GeoPoint mark = new GeoPoint(tLat, tLon); OverlayItem SubItem = new OverlayItem(Txt, null, mark); Drawable marker = map.getResources().getDrawable(R.drawable.а); SubItem.setMarker(marker); subItems.add(SubItem); } // Удалятор маркеров private void removeMarkers (int remIndex){ subItems.remove(remIndex); //Удаляем маркер subItems.add(remIndex, NullItem); //записываем на место удаленного нулевой маркер } 

    When adding, each new marker will have an index of +1, starting from 0. The delete function will replace the deleted marker with an empty one, while the numbering will not change.