NullPointerException в ItemizedOverlay.getIndexToDraw - PullRequest
14 голосов
/ 31 марта 2010

У меня относительно простая MapActivity, которую я пытаюсь сделать отображаемой список "лагерей" в пределах данного региона карты. Я создал кастом подкласс OverlayItem называется CampOverlayItem, пользовательский ItemizedOverlay вызывает CampsOverlay, который возвращает CampOverlayItems, и конечно, подкласс MapActivity, который заполняет карту.

Я извлекаю данные наложения из базы данных, используя AsyncTask как создано в моей деятельности. AsyncTask запускается из ViewTreeObserver.OnGlobalLayoutListener присоединен к MapView.

В методе OnPostExecute AsyncTask я создаю новый экземпляр моего класса 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)

Поскольку это кажется особенно актуальным, вот код для моего Подкласс ItemizedOverlay:

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

}

Кто-нибудь знает, что здесь может происходить? Я пытался чтобы убедиться, что все, что я контролирую, не равно нулю. Я могу предоставьте больше кода при необходимости.

Ответы [ 3 ]

20 голосов
/ 31 марта 2010

Я не вижу, куда вы звоните populate() на вашем CampsOverlay.

Вот пример проекта , показывающий асинхронную загрузку наложенных элементов - возможно, он даст вам некоторые идеи, если populate() не проблема.

3 голосов
/ 31 марта 2010

Он прав. Вы должны вызвать populate (), чтобы заполнить оверлей. Возможно, вы захотите создать все наложенные элементы в конструкторе, вызвать populate, а в createItem просто вернуть элемент из списка.

2 голосов
/ 23 августа 2010

«Теперь мне просто нужно выяснить, почему не отображаются элементы наложения»

В случае, если вы этого не сделали, вам нужно использовать статическую функцию на Drawable, которая объяснит, как позиционируется ваш маркер.

Вы можете использовать это в вашем CampsOverlay конструкторе:

super(boundCenter(defaultMarker));

Это будет означать, что источником вашего Drawable является центр. Вы также можете использовать boundCenterBottom(), чтобы указать, что источником является нижний центр Drawable.

...