2013-07-15 43 views
0

我想要什麼:中的AsyncTask添加覆蓋項目以OSMDroid地圖

我想在user's當前位置10個標誌和地圖,加載後在加載的AsyncTask從數據庫地圖。

什麼doenst工作

一切工作正常,除了10個額外的標記。我從DB加載它們,將它們添加到OverlayItems列表中,並使地圖無效 - 它們仍未顯示。
更新:現在工作:通過在之後創建ItemizedIconOverlay ,將其他項目加載到AsyncTask中,將顯示項目並按照要求工作。

此外,OverlayItem列表初始化爲零對象(顯然),但是在添加一個OverlayItem之後,它包含1個OverlayItem + 11個更多的null-Objects(或null-Refernces?null-Items?什麼是正確的稱呼)

我的問題

1)@ OverlayItems列表:?加載一切之後,還有一個空的對象,我想這可能會造成問題,但它沒有。 (測試完整列表,沒有區別)
爲什麼列表初始化爲零項,但是當我添加一個時,它包含12個項目? (11空,1「真正的」項目)(下面的代碼)

2)[解決]據我知道,如果我添加OverlayItems到列表和無效的地圖,他們應該顯示。如果我將項目添加到第二個列表中,並用第二個「覆蓋」第一個項目,它是否仍然有效? (由於it's不是同一個對象了,但僅僅是一個參考,以列表2,對不對?)
更新:
通過創建ItemizedIconOverlay 加載在的AsyncTask其他項目的項目顯示和工作爲inteded。

全碼
創建地圖

mResourceProxy = new DefaultResourceProxyImpl(getApplicationContext()); 
    mapView.setTileSource(TileSourceFactory.MAPNIK); 
    mapView.setBuiltInZoomControls(true); 
    mapView.setMultiTouchControls(true); 
    mapController = this.mapView.getController(); 
    mapController.setZoom(25); 
    GeoPoint center = new GeoPoint(DataManager.glat, DataManager.glon); 
    mapController.setCenter(center); 

    // items = null 
    items = new ArrayList<OverlayItem>(); // items is still empty 
    items.add(new OverlayItem("Here", "SampleDescription", center)); 
    // now, items contains one OverlayItem, but also 11 empty (null) Items 

    this.mLocationOverlay = new ItemizedIconOverlay<OverlayItem>(items, 
    new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() { 
       @Override 
       public boolean onItemSingleTapUp(final int index, 
         final OverlayItem item) { 


        Intent intent=new Intent(); 
        intent.putExtra("newShopName", item.mTitle); 
        intent.putExtra("newShopAdd", item.mDescription); 
        setResult(RESULT_OK, intent); 
        finish(); 

        return true; 
       } 
       @Override 
       public boolean onItemLongPress(final int index, 
         final OverlayItem item) { 

        toast = Toast.makeText(ShopChooseActivity.this, item.mTitle + ", " + item.mDescription, Toast.LENGTH_LONG); 
         toast.show(); 
         return false; 
        } 
       }, mResourceProxy); 

     this.mapView.getOverlays().add(this.mLocationOverlay); 
     mapView.invalidate(); 


     loadMap = new LoadChooseShop(ShopChooseActivity.this, items).execute(); 

從AsynTask更新與OverlayItems的新列表中的項目

items = loadMap.get(); 
if(items != null) 
mapView.invalidate(); 

回答

2
  1. 關於未在ItemizedIconOverlay中顯示的新項目 - 您使用什麼方法添加項目()?出於某種原因,它看起來像addItem(location,item)方法不會調用populate(),所以內部列表永遠不會被更新。現在使用addItem(item)方法。我應該指出,ItemizedIconOverlay是一個用戶提交的類,它實際上只是一個解決方案的起點。

  2. 您提到在您的項目列表中有空值。這就是Java的ArrayList的工作方式。該列表由不可變數組支持,因此當後備數組已滿並且您想要添加新項目時,該列表必須創建一個新的更大的後備數組。由於這是一項昂貴的操作,新陣列的尺寸將是舊尺寸的兩倍。後備陣列中未使用的「插槽」設置爲空。唯一重要的是mItemList.size()返回的內容。

+0

@ 1)我已經解決了這個問題,在您的幫助[這裏](http://stackoverflow.com/問題/ 17566421/osmdroid-crashes-when-zooming-out),忘記編輯問題 @ 2)好的解釋 –

0

你的項目將等於只要以null作爲的AsyncTask尚未完成。您需要初始化LoadChooseShop的onPostExecute中的所有內容。

+0

沒有他們地圖無法 - 我第一次對它們進行初始化,that's我的第一個問題點 –

相關問題