1

我想让用户从地图中删除一个点(或更具体地说,一个OverlayItem)。我跟着开发人员tutorial开始实施CustomMapView,在this教程中捕获地图上的长按。从地图中删除OverylayItem

所以现在我有一个程序允许用户在地图上放置点。我的下一个目标是让用户删除点。这是我的代码,当用户点击地图上的现有点时。

public class OurItemizedOverlay extends ItemizedOverlay { 

//Create new list of points 
private ArrayList<OverlayItem> mapOverlays = new ArrayList<OverlayItem>(); 
private Context mapContext; 
@Override 
protected boolean onTap(final int index) { 
    Button edit, remove; 

    //Get index of item tapped 
    OverlayItem item = mapOverlays.get(index); 

    //Create Dialog to show point info, allow for edit or removal. 
    LinearLayout layout = new LinearLayout(mapContext); 
    layout.setOrientation(LinearLayout.VERTICAL); 

    LayoutInflater inflater = LayoutInflater.from(mapContext); 
    AlertDialog.Builder builder = new AlertDialog.Builder(mapContext); 
    builder.setTitle(item.getTitle()); 
    builder.setMessage(item.getSnippet()); 

    View view = inflater.inflate(R.layout.view_or_edit_location_dialog, null); 
    builder.setView(view); 
    builder.show(); 

    //BUTTONS 

    edit = (Button)view.findViewById(R.id.edit); 
    remove = (Button)view.findViewById(R.id.delete); 

    //Edit Button Listener 
    edit.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

     } 
    }); 

    //Remove Button Listener 
    remove.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      removeOverlay(index); <-------- 

      Log.d("View location info", "user clicked delete."); 
      return; 
     } 
    }); 

    return true; 
} 

这是我的removeOverlay代码。

protected void removeOverlay(int index) { 

    mapOverlays.remove(index); 
    com.example.mapproject.MainActivity.mapView.invalidate(); 
} 

当我点击一个现有的点后,会出现一个对话框提供删除点。当我选择删除点时,点仍然保留在屏幕上。如果我放置一个新的点,那么删除的点会被删除。但是,如果我单击“已删除”点或其他现有点,程序就会因此错误而崩溃。

error

如果你有做什么线索,我会很感激您的来信!

编辑

在从Vishwa帕特尔尖端,我从地图马上使用postInvalidate()除去的点。然而,当我点击图标所在的位置时,我仍然会收到indexoutofbounds例外情况。

+0

代替'com.example.mapproject.MainActivity.mapView.invalidate();'尝试'v.invalidate()''中的onClick(视图v)....' – tozka

+1

你有打电话给'填充( )'再次?基本上ItemizedOverlay是要做很多事先预备。如果更新数据集,则必须有一种方法来重新创建所有缓存。首次创建此结构时调用填充。如果不允许在同一个对象上多次调用,则可以执行一些操作。为drawable创建一个新的状态并仅仅关闭它(不可见,忽略命中),或者你可以重新创建整个ItemizedOverlay并将其添加到MapView覆盖集合中 –

回答

1

我相信我找到了解决方案here。它似乎工作至今,答案是把下面一行到我removeOverlay方法,

setLastFocusedIndex(-1); 

的代码从我的自定义覆盖删除OverylayItem是,

protected void removeOverlay(OverlayItem overlayItem) { 

    mapOverlays.remove(overlayItem); 
    MainActivity.mapOverlays.remove(this); 
    setLastFocusedIndex(-1); 
    populate(); 

} 

任何想法/建议受欢迎的!

2

您可能需要致电上的invalidate(),迫使其重新绘制自己。正如评论者所提到的,您可能还需要重新拨打populate()。您的应用可能会崩溃,因为它正尝试致电onTap(),查看不存在的OverlayItem。您可能还想尝试任何可以“刷新”MapView和/或Overlay的方法,因为这是您需要做的以使OverlayItem消失。

+0

我试过这些方法,它们帮助删除图标,但是如果我点击那里的图标已经是,我会得到一个数组越界的错误,我发现一个页面记录类似的问题,似乎修复它! http://developmentality.wordpress.com/2009/10/19/android-itemizedoverlay-arrayindexoutofboundsexception-nullpointerexception-workarounds/ – TomSelleck

+0

我很高兴你能找到解决方案!祝好运与项目的其余部分。 – crocboy

1

使用

com.example.mapproject.MainActivity.mapView.postInvalidate(); 

,因为你正在从非UI线程的无效电话,为postInvalidate的文档中指定()尝试;

+0

嘿,这对于摆脱图标马上起作用!但是,仍然有几个问题..如果你点击图标的位置,应用程序将崩溃与索引outofbounds例外.. – TomSelleck

+1

@Tomcelic解决这个问题我想你还需要从列表中删除覆盖存在于MapActivity类中的mapOverlays(我假设您遵循官方开发者教程,该类应称为HelloGoogleMaps)。因此,您必须将该列表设为静态,并从该列表中删除此特定覆盖图(您可以通过简单地说HelloGoogleMaps.mapOverlays.remove(this)来完成此操作;这应该可以做到这一点)。 –

+0

不,似乎没有做到这一点:( – TomSelleck