0

我想要的是:

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

什么不起作用

一切正常,除了 10 个额外的标记。我从数据库中加载它们,将它们添加到 OverlayItems 列表中,并使地图无效 - 它们仍然没有显示。
更新:现在工作:通过在 AsyncTask 中加载其他项目创建 ItemizedIconOverlay ,项目将显示并按预期工作。

此外,OverlayItems 列表用零个对象初始化(显然),但在我添加一个 OverlayItem 后,它包含 1 个 OverlayItem + 11 个空对象(或空引用?空项目?什么是正确的术语?)

我的问题

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

2) [已解决]据我所知,如果我将 OverlayItems 添加到列表并使地图无效,则应该显示它们。如果我将项目添加到第二个列表,并用第二个“覆盖”第一个,它仍然有效吗?(因为它不再是同一个对象,而只是对 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 的新叠加项目列表更新项目

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

2 回答 2

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

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

于 2013-07-16T12:13:09.230 回答
0

只要 Asynctask 未完成,您的项目将等于 null。您需要在 LoadChooseShop 的 onPostExecute 中初始化所有内容。

于 2013-07-15T15:30:50.023 回答