我正在尝试允许用户从地图中删除一个点(或更具体地说,一个OverlayItem)。我跟着开发人员tutorial开始并在this教程中实现了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异常。
答案 0 :(得分:2)
您可能需要在invalidate()
上致电MapView
,强制它重新绘制自己。正如评论者提到的那样,您可能还需要重新调用populate()
。您的应用可能会崩溃,因为它试图为onTap()
调用不存在的OverlayItem
。您可能还想尝试任何可以“刷新”MapView
和/或叠加层的方法,因为这是使OverlayItem
消失所需的操作。
答案 1 :(得分:1)
尝试使用
com.example.mapproject.MainActivity.mapView.postInvalidate();
因为您正在从非UI线程进行无效调用,如postInvalidate()的文档中所指定的那样;
答案 2 :(得分:1)
我相信我找到了解决方案here。它似乎工作到目前为止,答案是将以下行放入我的removeOverlay方法,
setLastFocusedIndex(-1);
从我的自定义叠加中删除OverylayItem的代码是,
protected void removeOverlay(OverlayItem overlayItem) {
mapOverlays.remove(overlayItem);
MainActivity.mapOverlays.remove(this);
setLastFocusedIndex(-1);
populate();
}
欢迎任何想法/建议!