1

我试图允许用户从地图中删除一个点(或更具体地说,一个 OverlayItem)。我按照开发人员教程开始并在教程中实现了 CustomMapView 以捕获地图上的长按。

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

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();
}

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

错误

如果您知道该怎么做,我会很高兴收到您的来信!

编辑

根据 Vishwa Patel 的提示,我使用 postInvalidate() 立即从地图中删除了一个点。但是,当我单击图标所在的位置时,我仍然会遇到 indexoutofbounds 异常。

4

3 回答 3

2

您可能需要调用invalidate()您的MapView,强制它重新绘制自己。正如评论者所提到的,您可能还需要重新调用populate(). 您的应用程序可能正在崩溃,因为它试图调用onTap()一个OverlayItem不存在的。您可能还想尝试任何可以“刷新”MapView和/或覆盖的方法,因为这是您需要做的才能使OverlayItem消失。

于 2012-10-16T22:37:06.610 回答
1

尝试使用

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

因为您正在从非 UI 线程进行无效调用,如 postInvalidate() 的文档中所述;

于 2012-10-16T23:39:04.363 回答
1

我相信我在这里找到了解决方案。到目前为止似乎有效,答案是将以下行放入我的 removeOverlay 方法中,

setLastFocusedIndex(-1);

从我的自定义 Overlay 中删除 OverylayItem 的代码是,

    protected void removeOverlay(OverlayItem overlayItem) {

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

}

欢迎任何想法/建议!

于 2012-10-17T20:01:55.890 回答