Ответ 1
Я не вижу, где вы вызываете populate()
на CampsOverlay
.
Вот пример проекта, показывающий асинхронную загрузку элементов overlay - возможно, это даст вам некоторые идеи, если populate()
не является проблема.
У меня относительно простая 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();
}
}
Кто-нибудь знает, что здесь может быть? Я попытался чтобы проверить, что все, что у меня есть, не равно null. Я могу при необходимости добавьте больше кода.
Я не вижу, где вы вызываете populate()
на CampsOverlay
.
Вот пример проекта, показывающий асинхронную загрузку элементов overlay - возможно, это даст вам некоторые идеи, если populate()
не является проблема.
Он прав. Вы должны называть populate() для заполнения оверлея. Вы можете создать все элементы наложения в конструкторе, вызвать заполнение, а в createItem просто вернуть элемент из списка.
"Теперь мне просто нужно выяснить, почему элементы оверлея не появляются"
Если вы этого не сделали, это потому, что вам нужно использовать статическую функцию на вашем Drawable
, которая объяснит, как размещен ваш маркер.
Вы можете использовать это в своем конструкторе CampsOverlay
:
super(boundCenter(defaultMarker));
Это будет означать, что начало вашего Drawable
является центром. Вы также можете использовать boundCenterBottom()
, чтобы указать, что начало координат - это нижний центр Drawable
.