我有一个自定义类的ArrayList。列表中大约有10个对象,每个对象都有Title、Snippet、LatLng等详细信息。通过使用我的自定义类函数,如getTitle, getSnippet, getLatLng等,我已经成功地将所有10个添加到Map中。
现在,当我点击信息窗口(标记),我希望能够以某种方式知道我的自定义类的哪个对象的标记对应。
例如,如果我单击麦当劳市场,我希望能够知道该标记属于数组列表中的哪个项。
我一直在看MarkerOptions,似乎没有任何东西可以用来识别相关的自定义对象。
如果这个问题太让人困惑,我就简单点:
ArrayList<CustomObj> objects = blah
map.addMarker(new MarkerOptions().position(new LatLng(
Double.parseDouble(result.get(i).getCompanyLatLng()
.split(",")[0]), Double.parseDouble(result
.get(i).getCompanyLatLng().split(",")[1])))
.title(result.get(i).getCompanyName())
.snippet(result.get(i).getCompanyType())
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.pin)));
现在,当点击它时,我转到下一页。下一页需要知道哪个对象被点击,以便我可以发送其他细节到该页(例如,需要加载的图像url等)。
我如何添加一个唯一的整数或任何标识符到我的标记?
一个正确的方法是使用Map<Marker, CustomObj>
来存储所有标记:
Marker marker = map.addMarker(...);
map.put(marker, result.get(i));
和在onInfoWindowClick
中:
CustomObj obj = map.get(marker);
另一个尝试是使用Android地图扩展,它添加getData
和setData
方法到Marker
,所以你可以分配你的CustomObj
对象后创建标记和检索它在任何回调
我使用代码片段文本保存唯一的ID。如果你需要的片段,它将为弹出,在那里你可以做你自己的(通过查找对象的ID),所以你不会错过它,但你肯定会错过一个唯一的ID来识别对象。
为了找到正确的对象,我只需要遍历它们:
for(SomeObject anObject : someObjects) {
if(marker.getSnippet().equalsIgnoreCase(anObject.getID())) {
//you got at match
}
}
根据以下链接的讨论,Marker。equals和Marker。hashCode有时不工作。例如,当地图被平移或缩放,或者它被重新启动/恢复。
为标记添加标签/标识符
所以对于HashMap来说,Marker的ID是比Marker本身更好的键。
Map<String, MyObject> markerMap = new HashMap<String, MyObject>();
Marker marker = map.addMarker(...);
MyObject myObject = new MyObject();
markerMap.put(marker.getId(), myObject);
我认为使用纬度和经度,这是可以做到的
map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(final Marker marker) {
LatLng pos = marker.getPosition();
int arryListPosition = getArrayListPosition(pos);
return true;
}
});
方法getArrayListPosition
为
private int getArrayListPosition(LatLng pos) {
for (int i = 0; i < result.size(); i++) {
if (pos.latitude == result.get(i).getCompanyLatLng().split(",")[0]) {
if (pos.longitude == result.get(i).getCompanyLatLng()
.split(",")[1])
return i;
}
}
return 0;
}
此方法将返回您点击的Marker
的ArrayList
的位置。你可以从那个位置获取数据。
我迟了4年才回答这个问题,但我真的很惊讶为什么没有人谈论marker.setTag
和marker.getTag
方法。
在google API文档中,
这比单独存储
更容易Map<Marker, Object>
他们引入了setTag
和getTag
来避免使用Map<...>
。你可以这样使用:
Marker marker = map.addMarker(...);
marker.setTag(result.get(i)); //Store your marker information here.
//To fetch your object...
map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
CustomObj obj = (CustomObj)marker.getTag();
//Your click handle event
// Pass the obj to another activity and you are done
return false;
}
});