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

postInvalidate()のドキュメントで指定されているように、UI以外のスレッドからinvalidate呼び出しを行っているため。

于 2012-10-16T23:39:04.363 に答える
1

私はここで解決策を見つけたと思います。これまでのところうまくいくようですが、答えは次の行を私のremoveOverlayメソッドに入れることでした。

setLastFocusedIndex(-1);

カスタムオーバーレイからOverylayItemを削除するコードは次のとおりです。

    protected void removeOverlay(OverlayItem overlayItem) {

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

}

どんな考え/提案も大歓迎です!

于 2012-10-17T20:01:55.890 に答える