Удаление OverylayItem с карты

Я пытаюсь разрешить пользователю удалить точку (или, точнее, OverlayItem) с карты. Я следил за учебником для разработчиков, чтобы начать работу, и внедрил CustomMapView в < href="http://www.kind-kristiansen.no/2011/android-handling-longpresslongclick-on-map-revisited/" rel="nofollow noreferrer">это руководство по захвату длительного нажатия на карта.

Итак, теперь у меня есть программа, которая позволяет пользователю размещать точки на карте. Моя следующая цель — позволить пользователю удалять баллы. Вот мой код, когда пользователь щелкает существующую точку на карте.

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

После того, как я нажму на существующую точку, появится диалоговое окно, предлагающее удалить точку. Когда я выбрал удаление точки, она по-прежнему остается на экране. Если я поставлю новую точку, «удаленная» будет удалена. Однако, если я нажму на «удаленную» точку или другую существующую точку, программа вылетит с этой ошибкой.

ошибка

Если у вас есть ключ к тому, что делать, я был бы признателен за известие от вас !!

Изменить

Следуя совету Вишвы Пателя, я сразу удаляю точку с карты с помощью функции postInvalidate(). Тем не менее, я все еще получаю исключения indexoutofbounds, когда я нажимаю, где был значок.


person TomSelleck    schedule 16.10.2012    source источник
comment
Вместо этого com.example.mapproject.MainActivity.mapView.invalidate(); попробуйте с v.invalidate () в onClick(View v)....   -  person tozka    schedule 17.10.2012
comment
Вам нужно снова позвонить populate()? По сути, ItemizedOverlay предназначен для предварительного кэширования. Если вы обновляете набор данных, должен быть способ переделать все кеши. Populate вызывается при первом создании этой структуры. Если его нельзя вызывать несколько раз для одного и того же объекта, вы можете сделать несколько вещей. Создайте новое состояние для drawable и просто деактивируйте его (невидимый и игнорируйте попадания), или вы можете воссоздать весь ItemizedOverlay и добавить его в коллекцию наложений MapView.   -  person Greg Giacovelli    schedule 17.10.2012


Ответы (3)


Вероятно, вам нужно вызвать invalidate() на вашем MapView, заставив его перерисовать себя. Как упоминали комментаторы, вам также может потребоваться повторно вызвать populate(). Возможно, ваше приложение дает сбой, потому что оно пытается вызвать onTap() для несуществующего OverlayItem. Вы также можете попробовать любой метод, который может «обновить» MapView и/или наложение, потому что это то, что вам нужно сделать, чтобы OverlayItem исчезло.

person crocboy    schedule 16.10.2012
comment
Я попробовал эти методы, они помогли удалить значок, но если бы я щелкнул там, где был значок, я бы получил ошибку массива за пределами границ, я нашел страницу, документирующую аналогичную проблему, которая, казалось, исправила ее! developmentality.wordpress.com/2009/10/19 / - person TomSelleck; 18.10.2012
comment
Я рад, что вы смогли найти решение! Удачи в остальной части проекта. - person crocboy; 18.10.2012

Попробуйте использовать

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

поскольку вы делаете недействительный вызов из потока, отличного от пользовательского интерфейса, как указано в документации для postInvalidate();

person Vishwa Patel    schedule 16.10.2012
comment
Эй, это помогло избавиться от значков сразу! Тем не менее, есть еще пара проблем. Если щелкнуть в том месте, где был значок, приложение вылетит с исключением indexoutofbounds.. - person TomSelleck; 17.10.2012
comment
@Tomcelic, чтобы решить эту проблему, я думаю, вам также нужно будет удалить наложение из списка Overlay mapOverlays, которое существует в вашем классе MapActivity (я предполагаю, что, поскольку вы следуете официальному руководству для разработчиков, класс должен называться HelloGoogleMaps). Итак, вам придется сделать этот список статическим и удалить конкретное наложение из этого списка (вы можете сделать это, просто сказав HelloGoogleMaps.mapOverlays.remove(this); это должно помочь). - person Vishwa Patel; 17.10.2012
comment
Нет, похоже, это тоже не помогло :( - person TomSelleck; 17.10.2012
comment
Кажется, я нашел решение! Кажется, пока работает, дайте мне знать, что вы думаете, developmentality.wordpress.com/2009/10/19/ - person TomSelleck; 17.10.2012
comment
@Tomcelic Это здорово! Да, статья, на которую вы ссылаетесь, имеет смысл. - person Vishwa Patel; 18.10.2012

Кажется, я нашел решение здесь. Кажется, пока это работает, ответ состоял в том, чтобы поместить следующую строку в мой метод removeOverlay:

setLastFocusedIndex(-1);

Код для удаления OverylayItem из моего пользовательского наложения:

    protected void removeOverlay(OverlayItem overlayItem) {

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

}

Любые мысли/предложения приветствуются!

person TomSelleck    schedule 17.10.2012