Android ItemizeOverlay.getIndexToDraw中的NullPointerException

Android ItemizeOverlay.getIndexToDraw中的NullPointerException,android,android-mapview,Android,Android Mapview,我有一个相对简单的MapActivity,我正在尝试显示它 给定地图区域内的“营地”列表。我已经创建了一个自定义 OverlayItem的子类,称为CampOverlayItem,是一个自定义 返回CampOverlayItems的名为CampsOverlay的ItemizedOverlay,以及 当然,是一个填充映射的MapActivity子类 我使用异步任务从数据库中提取覆盖数据 在我的活动中创建。异步任务是从 ViewTreeObserver.OnGlobalLayoutListener连

我有一个相对简单的MapActivity,我正在尝试显示它 给定地图区域内的“营地”列表。我已经创建了一个自定义 OverlayItem的子类,称为CampOverlayItem,是一个自定义 返回CampOverlayItems的名为CampsOverlay的ItemizedOverlay,以及 当然,是一个填充映射的MapActivity子类

我使用异步任务从数据库中提取覆盖数据 在我的活动中创建。异步任务是从 ViewTreeObserver.OnGlobalLayoutListener连接到MapView

在AsyncTask的onPostExecute方法中,我创建了一个新实例 我的CampsOverlay课程,并将从 数据库(在doInBackground中获取)。然后我打电话:

mapView.getOverlays().add(newOverlay);
其中newOverlay是我刚刚创建的CampsOverlay。所有这些代码 运行时没有错误,但当贴图尝试绘制自身时,我得到一个 具有以下堆栈跟踪的NullPointerException:

java.lang.NullPointerException
   at
com.google.android.maps.ItemizedOverlay.getIndexToDraw(ItemizedOverlay.java:
211)
   at
com.google.android.maps.ItemizedOverlay.draw(ItemizedOverlay.java:240)
   at com.google.android.maps.Overlay.draw(Overlay.java:179)
   at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:
42)
   at com.google.android.maps.MapView.onDraw(MapView.java:476)
   at android.view.View.draw(View.java:6274)
   at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
   at android.view.ViewGroup.drawChild(ViewGroup.java:1524)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
   at android.view.View.draw(View.java:6277)
   at android.widget.FrameLayout.draw(FrameLayout.java:352)
   at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
   at android.view.ViewGroup.drawChild(ViewGroup.java:1524)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
   at android.view.ViewGroup.drawChild(ViewGroup.java:1524)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
   at android.view.ViewGroup.drawChild(ViewGroup.java:1524)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
   at android.view.ViewGroup.drawChild(ViewGroup.java:1524)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
   at android.view.View.draw(View.java:6277)
   at android.widget.FrameLayout.draw(FrameLayout.java:352)
   at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
   at android.view.View.draw(View.java:6277)
   at android.widget.FrameLayout.draw(FrameLayout.java:352)
   at com.android.internal.policy.impl.PhoneWindow
$DecorView.draw(PhoneWindow.java:1883)
   at android.view.ViewRoot.draw(ViewRoot.java:1332)
   at android.view.ViewRoot.performTraversals(ViewRoot.java:1097)
   at android.view.ViewRoot.handleMessage(ViewRoot.java:1613)
   at android.os.Handler.dispatchMessage(Handler.java:99)
   at android.os.Looper.loop(Looper.java:123)
   at android.app.ActivityThread.main(ActivityThread.java:4203)
   at java.lang.reflect.Method.invokeNative(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:521)
   at com.android.internal.os.ZygoteInit
$MethodAndArgsCaller.run(ZygoteInit.java:791)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
   at dalvik.system.NativeStart.main(Native Method)
因为它似乎特别相关,下面是我的 ItemizeOverlay子类:

public class CampsOverlay extends ItemizedOverlay<CampOverlayItem> {
    private ArrayList<Camp> camps = null;

    public CampsOverlay(Drawable defaultMarker, ArrayList<Camp> theCamps)
{
        super(defaultMarker);
        this.camps = theCamps;
    }

    @Override
    protected CampOverlayItem createItem(int i) {
        Camp camp = camps.get(i);
        CampOverlayItem item = new CampOverlayItem(camp);
        return item;
    }

    @Override
    protected boolean onTap(int index) {
        // TODO Auto-generated method stub
        return super.onTap(index);
    }

    @Override
    public int size() {
        return camps.size();
    }

}
公共类CampsOverlay扩展了ItemizedOverlay{
private ArrayList=null;
公共营地车道(可绘制默认标记,阵列列表)
{
超级(默认标记);
此参数=电流;
}
@凌驾
受保护的CampOverlayItem createItem(int i){
Camp=camps.get(i);
CampOverlayItem项目=新CampOverlayItem(营地);
退货项目;
}
@凌驾
受保护的布尔onTap(整数索引){
//TODO自动生成的方法存根
返回super.onTap(索引);
}
@凌驾
公共整数大小(){
返回营地。大小();
}
}
有人知道这里会发生什么吗?我试过了 验证我控制的所有内容是否为非空。我可以
如果需要,请提供更多代码。

我看不到您在
CampsOverlay
上调用
populate()


显示覆盖项的异步加载——如果
populate()
不是问题的话,它可能会给您一些想法。

他是正确的。必须调用populate()来填充覆盖。您可能需要在构造函数中创建所有覆盖项,调用populate,然后在createItem中从列表中返回该项。

“现在我只需要找出覆盖项不出现的原因”

如果您没有这样做,那是因为您必须在
Drawable
上使用一个静态函数来解释标记是如何定位的

您可以在
CampsOverlay
构造函数中使用此选项:

super(boundCenter(defaultMarker))


这将表明
可绘制的
的原点是中心。您还可以使用
boundCenterBottom()
指示原点是
Drawable

的底部中心。您完全正确,谢谢标记。在问这个问题之前,您可能会认为我会更仔细地查看您的示例代码。现在我只需要弄清楚为什么覆盖项没有出现;)在构造函数中创建项而不是在createItem中一次创建一个项是否有优势?从我对文档的阅读来看,ItemizedOverlay将缓存createItem的结果,因此也不一定需要保留子类中的结果。