Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在AsyncTask中将覆盖项添加到OSMDroid映射_Java_Android_Osmdroid - Fatal编程技术网

Java 在AsyncTask中将覆盖项添加到OSMDroid映射

Java 在AsyncTask中将覆盖项添加到OSMDroid映射,java,android,osmdroid,Java,Android,Osmdroid,我想要什么: 我想要一个地图,在用户的当前位置有一个标记,还有10个,在加载地图后从数据库加载到AsyncTask中 什么不起作用 除了10个额外的标记外,一切正常。我从数据库中加载它们,将它们添加到覆盖项列表中,并使映射无效-它们仍然没有显示。 更新:立即生效:在异步任务中加载附加项后,通过创建ItemIzeDictionOverlay,这些项将显示并按指定方式工作 此外,OverlayItems列表是用零个对象初始化的(显然),但在我添加一个OverlayItem后,它包含1个Overlay

我想要什么:

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

什么不起作用

除了10个额外的标记外,一切正常。我从数据库中加载它们,将它们添加到覆盖项列表中,并使映射无效-它们仍然没有显示。
更新:立即生效:在异步任务中加载附加项后,通过创建ItemIzeDictionOverlay,这些项将显示并按指定方式工作

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

我的问题

1) @List of OverlayItems:加载完所有内容后,仍然有一个空对象,我想这可能会导致问题,但没有。(使用完整列表测试,无差异)
为什么列表初始化为零项,但当我添加一项时,它包含12项?(11空,1个“真实”项目)(代码如下)

2) [SOLVED]据我所知,如果我将覆盖项添加到列表中并使地图无效,它们应该显示出来。如果我将项目添加到第二个列表中,并用第二个列表“覆盖”第一个列表,它仍然有效吗?(因为它不再是同一个对象,而只是对列表2的引用,对吗?
更新:在AsyncTask中加载附加项后,通过创建ItemIzedEdiconOverlay,这些项将显示并按指定方式工作

完整代码
创建地图

 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();

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

  • 关于ItemIzeDictionOverlay中未显示的新项-您使用什么方法添加项()?出于某种原因,addItem(location,item)方法似乎没有调用populate(),因此内部列表永远不会更新。现在使用addItem(item)方法。我应该指出,itemizedictionoverlay是一个用户提交的类,实际上只是解决方案的起点

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


  • 不,它们不是-我先初始化它们,这是我第一次初始化的重点question@1)我已经在你的帮助下解决了这个问题[这里](),只是忘了编辑问题@2)很好的解释
    items = loadMap.get();
    if(items != null)
    mapView.invalidate();