Android Добавление новой точки в MapView (не обновлять)

Я работаю в Treasure Quest, который ведет пользователя через рут. У меня проблемы с отображением моего текущего местоположения на карте, где также отображаются квестовые точки

Я расширил ItemizedOverlay

public class QuestItemizedOverlay extends ItemizedOverlay<OverlayItem> {

    private ArrayList<OverlayItem> mOverlays= new ArrayList<OverlayItem>();

    public QuestItemizedOverlay(Drawable defaultmarker) {
        super(boundCenterBottom(defaultmarker));
        populate();     
    }

    @Override
    protected OverlayItem createItem(int i) {
        return mOverlays.get(i);
    }

    public void addOverlay(OverlayItem overlay) {
        mOverlays.add(overlay);
        populate();
    }

    public void removeItem(int index) {
        mOverlays.remove(index);
        populate();
    }

    @Override 
    public int size() {
        return mOverlays.size();
    }

}

У меня есть слушатель, когда мое местоположение меняется:

private final LocationListener locationlistener= new LocationListener() {
        public void onLocationChanged(Location location) {
            Log.i("LOCATION_UPDATED","");
            updateWithNewLocation(location);
            mapview.invalidate();
    }
        public void onProviderDisabled(String provider) {

        }

        public void onProviderEnabled(String provider) { }
        public void onStatusChanged(String provider, int sttus, Bundle extras) { }
    };

И метод updatewithNewlocation имеет следующий код:

private void updateWithNewLocation(Location location) {
      Double curlat=location.getLatitude();
          Double curlong=location.getLongitude();
          GeoPoint point=new GeoPoint((int)(curlong*1E6),(int) (curlat*1E6));
          OverlayItem overlayitem=new OverlayItem(point,"I'm here","This is where you are");
          Drawable marker=this.getResources().getDrawable(R.drawable.eplogo_marker);          
          overlayitem.setMarker(marker);
          itemizedoverlay.addOverlay(overlayitem);
          mapOverlays.clear();
          mapOverlays.add(itemizedoverlay);
}

Отладка с помощью DDMS (просто тестирование), прослушиватель работает отлично, и mOverlays моего представления карты растет, когда я меняю местоположение с помощью DDMS, но когда я вызываю mapview.invalidate(), ничего не происходит.

Какой способ обновить карту?

И еще один вопрос, что произойдет, если у mapOverlay есть более одного itemizedoverlay, каждый из которых имеет несколько маркеров?

заранее спасибо


person pekechis    schedule 19.04.2011    source источник
comment
Все выглядит хорошо для меня. Единственный код строки, который мне не хватает в updateWithNewLocation, это mapOverlays = yourMapView.getOverlays();. Или, может быть, вы инициализируете его где-то еще. Вы получаете исключения?   -  person Vincent    schedule 20.04.2011


Ответы (1)


@pekechis: после обновления mapOverLays (добавления нового и т. д.) просто позвоните

mapView.postInvalidate();

это обновит вид карты. ваша проблема также может быть вызвана тем, что вы не вызываете это внутри потока пользовательского интерфейса, например. как это

mActivity.runOnUiThread(new Runnable() {
 public void run() {            
   mapView.postInvalidate();
  }
});
person beerstorm    schedule 24.05.2011
comment
вам не нужно вызывать postInvalidate из runnable в потоке пользовательского интерфейса, потому что postInvalidate запускается в потоке пользовательского интерфейса. Из документа: используйте это, чтобы аннулировать представление из потока, отличного от пользовательского интерфейса. :-) - person cgwyllie; 19.10.2011
comment
postInvalidate работал у меня. Я вызываю его из onPostExecute() в AsyncTask, который выполняется в потоке пользовательского интерфейса. - person Sagar Hatekar; 02.12.2011
comment
В документации строго указано, что вы должны вызывать его из потока НЕ ​​UI, вызов гайки из потока UI также работает. - person Indrek Kõue; 07.03.2012