在AsyncTask中将覆盖项添加到OSMDroid-Map

时间:2013-07-15 11:33:49

标签: java android osmdroid

我想要的是什么:

我想要一个带有标记的地图在用户的当前位置和另外10个,在加载地图后从数据库加载到AsyncTask中。

做什么工作

除了10个额外的标记外,一切正常。我从DB加载它们,将它们添加到OverlayItems列表中,并使地图无效 - 它们仍未显示。
更新现在可以使用:通过在中加载AsyncTask中的其他项目后创建ItemizedIconOverlay ,可以显示项目并按照有意的方式工作。

此外,OverlayItems列表初始化为零对象(显然),但在我添加一个OverlayItem后,它包含1个OverlayItem + 11个以上的null-Objects(或null-Refernces?null-Items?是正确的术语?)

我的问题

1)@ OverlayItems列表:加载所有内容后,仍然有一个null-Object,我认为这可能会导致问题,但它没有。 (测试完整列表,没有区别)
为什么列表初始化为零项,但是当我添加一个时,它包含12个项目? (11 null,1“real”item)(下面的代码)

2) [已解决] 据我所知,如果我将OverlayItems添加到List并使地图无效,则应显示它们。如果我将项目添加到第二个列表,并用第二个列表“覆盖”第一个,它是否仍然有效? (因为它不再是同一个对象,而只是对list2的引用,对吗?)
更新:通过在
中加载AsyncTask中的其他项目后创建ItemizedIconOverlay ,可以显示项目并按照有意的方式工作。

完整代码
   创建地图

 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的新OverlayItem列表更新项目

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

2 个答案:

答案 0 :(得分:2)

  1. 关于未在ItemizedIconOverlay中显示的新项目 - 您使用什么方法添加项目()?由于某种原因,看起来addItem(location,item)方法不会调用populate(),因此内部列表永远不会更新。立即使用addItem(item)方法。我应该指出,ItemizedIconOverlay是一个用户提交的类,实际上只是解决方案的起点。

  2. 您提到项目列表中有空值。这就是Java的ArrayList的工作方式。该列表由不可变数组支持,因此当支持数组已满并且您想要添加新项时,该列表必须创建一个新的更大的后备数组。由于这是一项昂贵的操作,新阵列的尺寸将是旧阵列的两倍。后备阵列中未使用的“插槽”设置为null。唯一重要的是mItemList.size()返回的内容。

答案 1 :(得分:0)

只要Asynctask没有完成,您的项目将等于null。您需要在LoadChooseShop的onPostExecute中进行初始化。