Код, использующий ItemizedOverlayWithFocus

В настоящее время используется ItemizedIconOverlay из библиотеки OSMdroid.

import org.osmdroid.views.overlay.ItemizedIconOverlay;

И я установил свои параметры таким образом:

public class OsmActivity extends Activity implements LocationListener{
    private ItemizedIconOverlay<OverlayItem> mMyLocationOverlay
...
}

И я добавляю элементы таким образом:

    mItems.add(new OverlayItem("Title 2", "Sample Description2", new GeoPoint((int)(35.1359488*1E6),(int)(33.3336289*1E6))));
    mItems.add(new OverlayItem("Title 3", "Sample Description3", new GeoPoint((int)(35.1259488*1E6),(int)(33.3436289*1E6))));
    this.mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(mItems, myCustomIconMarker, new Glistener(), mResourceProxy);

Теперь, как мне это сделать с этим ItemizedOverlayWithFocus?

http://code.google.com/p/osmdroid/source/browse/trunk/osmdroid-android/src/org/osmdroid/views/overlay/ItemizedOverlayWithFocus.java?r=802

Вот что меня смущает:

ItemizedOverlayWithFocus<T extends OverlayItem> extends ItemizedOverlay<T>

Что означает Т?

Может ли кто-нибудь опубликовать пример кода, который его использует?


person bubbly    schedule 11.05.2012    source источник


Ответы (1)


на самом деле не пытался написать какой-либо код для резервного копирования, но, быстро просмотрев рассматриваемый код, вы сможете сделать именно то, что делаете, но замените ItemizedIconOverlay на ItemizedOverlayWithFocus

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

поэтому, когда у вас есть ItemizedIconOverlay, вы говорите, что внутренности ItemizedIconOverlay будут работать только с OverlayItems (или их подклассами).

то же самое применяется к ItemizedOverlayWithFocus

это говорит о том, что когда вы создаете свой конструктор (и все массивы элементов и т. д., которые вы в него помещаете), тип данных, который вы указываете в шевронах ‹>, должен иметь тип OverlayItem или должен расширять OverlayItem.

так что теоретически ваш код может быть изменен на

    private ItemizedOverlayWithFocus<OverlayItem> mMyLocationOverlay;
...
mItems.add....

хитрость заключается в конструкторе, поскольку класс WithFocus имеет конструкторы, отличные от тех, которые вы использовали выше, у вас есть выбор (где это будет работать, пока вы находитесь в классе активности, поскольку вам нужен объект Context)

    this.mMyLocationOverlay = newItemizedOverlayWithFocus<OverlayItem>(this, mItems, new GListener());

или this.mMyLocationOverlay = newItemizedOverlayWithFocus(this, mItems, new GListener(), mResourceProxy);

или (вам придется заполнить цитируемые «пробелы» на этом)

    this.mMyLocationOverlay = newItemizedOverlayWithFocus<OverlayItem>(this, mItems, 'Drawable marker', 'Point markerHotspot', 'Drawable markerFocusedBase', 'Point markerFocusedHotspot', 'int focusedBackgroundColour', new GListener(), mResourceProxy);
person rspython    schedule 11.05.2012
comment
В ItemizedOverlayWithFocus есть следующее: ItemizedOverlayWithFocus‹T extends OverlayItem› extends ItemizedOverlay‹T›, где в ItemizedOverlay это ‹Item extends OverlayItem›... T vs Item. какая разница? - person bubbly; 11.05.2012
comment
нет, это имя переменной. (технически это тип шаблона, но думайте об этом как о специальном имени переменной), если вы посмотрите на исходный код для них обоих, в том, где это «T» (которое является де-факто принятым стандартным именем в дженериках), где бы вы ни находились переменная типа T, она будет любого типа, который вы передаете между шевронами, поэтому для ‹OverlayItem› везде, где есть переменная типа 'T', она будет иметь тип OverlayItem. другой класс такой же, но они назвали свою переменную шаблона «Item» вместо «T» - person rspython; 11.05.2012
comment
лучший ориентир для понимания дженериков — учебник по дженерикам java docs.oracle. com/javase/tutorial/java/generics/index.html - person rspython; 11.05.2012