在地图上创建多个标记,但只记住最后一个标记

时间:2014-05-27 11:41:24

标签: java android

我使用tho代码在我的地图上添加标记。问题是如果我创建了多个标记,我可以在地图上看到我的所有标记,但如果我退出应用程序并重新打开,它只会记住最后一个标记。我想我必须创建一个数组列表和一个循环。不幸的是我无法找到如何做到这一点的例子,我想也是因为我使用Mapsforge 0.3.1而不是谷歌地图。

这是在onCreate

之外
ListOverlay myListOverlay;
List<OverlayItem> myOverlayItems;
Marker myMarker = null;
SharedPreferences prefs = null;

这是onCreate

中的代码
myListOverlay = new ListOverlay();
myOverlayItems = myListOverlay.getOverlayItems();
mapView.getOverlays().add(myListOverlay);

prefs = this.getSharedPreferences("MotionEvent",MODE_PRIVATE); 
    //Check whether your preferences contains any values then we get those values
    if((prefs.contains("Lat")) && (prefs.contains("Lon"))){   

        String lat = prefs.getString("Lat","");
        String lon = prefs.getString("Lon", ""); 

        GeoPoint l =new GeoPoint(Double.parseDouble(lat),Double.parseDouble(lon));
        myMarker = createMarker(l, R.drawable.ic_location);
        myOverlayItems.add(myMarker);
            byte viewMarker =   this.mapView.getMapViewPosition().getZoomLevel();
            this.mapView.getMapViewPosition().setZoomLevel(viewMarker); 
            this.mapView.getMapViewPosition().setCenter(l);
    } 

mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {


            @Override
            public void onLongPress(MotionEvent e) {

                if (e.getAction() == MotionEvent.ACTION_DOWN) {

                    byte viewMarker =   mapView.getMapViewPosition().getZoomLevel();
                    float x = e.getX();
                    float y = e.getY();
                    GeoPoint gPt = mapView.getProjection().fromPixels((int)x,   (int)y);
                    myMarker = createMarker(gPt, R.drawable.ic_location);
                    myOverlayItems.add(myMarker);
                    mapView.getMapViewPosition().setZoomLevel(viewMarker); 
                    prefs.edit().putString("Lat",String.valueOf(gPt.latitude)).commit();
                    prefs.edit().putString("Lon",String.valueOf(gPt.longitude)).commit();

                    DialogMyMarkers();



                 }



        }

    });

    mapView.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v0, MotionEvent e) {

            // Only fires if Mapview touched
            return mGestureDetector.onTouchEvent(e);
        }


    }); 

DialogMyMarkers打开编辑文本,为标记指定名称。然后保存标记的名称并显示在myMarkersDialog

     protected void myMarkersDialog() {

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        LayoutInflater inflater = getLayoutInflater();
        View convertView = (View) inflater.inflate(R.layout.my_markers_listview, null);
        builder.setView(convertView);
        builder.setTitle("List");
        lv = (ListView) convertView.findViewById(R.id.listView1);
         if (prefs.contains("Name"))
          {
             String name = prefs.getString("Name", "0");
                String[] values = new String[] {name};
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,values);
                lv.setAdapter(adapter);

          }

    builder.setNegativeButton(getResources().getString(R.string.no_dialog), new DialogInterface.OnClickListener() {

           @Override
           public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
           }

        });


        AlertDialog alert = builder.create();
        alert.show();
            }

但是,当我在地图上有多个标记时,我怎么能这样做呢?

2 个答案:

答案 0 :(得分:0)

我认为这个错误在线:

myListOverlay = new ListOverlay();
myOverlayItems = myListOverlay.getOverlayItems();

为什么需要重新创建叠加层?

建议:在GoogleMaps V2上书写更容易!

答案 1 :(得分:0)

是的,您的假设是正确的 我认为也是因为我使用Mapsforge 0.3.1而不是Google地图 您可以使用Google Map API并尝试存储标记使用sql-lite数据库的信息。我想你会得到所需的输出

完成此示例here