2013-07-15 36 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我的第一个问题点 –

相关问题