我想让用户从地图中删除一个点(或更具体地说,一个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();
}
当我点击一个现有的点后,会出现一个对话框提供删除点。当我选择删除点时,点仍然保留在屏幕上。如果我放置一个新的点,那么删除的点会被删除。但是,如果我单击“已删除”点或其他现有点,程序就会因此错误而崩溃。
如果你有做什么线索,我会很感激您的来信!
编辑
在从Vishwa帕特尔尖端,我从地图马上使用postInvalidate()除去的点。然而,当我点击图标所在的位置时,我仍然会收到indexoutofbounds例外情况。
代替'com.example.mapproject.MainActivity.mapView.invalidate();'尝试'v.invalidate()''中的onClick(视图v)....' – tozka
你有打电话给'填充( )'再次?基本上ItemizedOverlay是要做很多事先预备。如果更新数据集,则必须有一种方法来重新创建所有缓存。首次创建此结构时调用填充。如果不允许在同一个对象上多次调用,则可以执行一些操作。为drawable创建一个新的状态并仅仅关闭它(不可见,忽略命中),或者你可以重新创建整个ItemizedOverlay并将其添加到MapView覆盖集合中 –