ユーザーが地図からポイント(より具体的には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例外が発生します。