我有一个自定义类的ArrayList。列表中大约有10个对象,每个对象都有Title,Snippet,LatLng等详细信息。我已经使用我的自定义类函数(如getTitle,getSnippet,getLatLng等)将所有10个成功添加到Map中。
现在,当我点击信息窗口(标记)时,我希望能够以某种方式知道我的自定义类的哪个对象与该标记对应。
例如,如果我点击麦当劳市场,我希望能够知道我的ArrayList中哪个项目属于该标记。
我一直在看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)));
现在点击这个,我继续下一页。下一页需要知道单击了WHICH对象,以便我可以将其他详细信息发送到该页面(例如,需要加载的图像URL等)。
如何在标记中添加唯一的整数或任何标识符?
答案 0 :(得分:6)
一种正确的方法是使用存储所有标记的Map<Marker, CustomObj>
:
Marker marker = map.addMarker(...);
map.put(marker, result.get(i));
和onInfoWindowClick
:
CustomObj obj = map.get(marker);
另一种尝试是使用Android Maps Extensions,将getData
和setData
方法添加到Marker
,这样您就可以在创建标记和检索后分配CustomObj
对象它在任何回调中。
答案 1 :(得分:1)
我使用了代码段文本来保存唯一ID。如果您需要该片段,它将用于弹出窗口,您可以自己创建(通过从ID中查找对象),这样您就不会错过它,但您肯定会错过用于识别对象的唯一ID。
要找到正确的对象,我只需迭代它们:
for(SomeObject anObject : someObjects) {
if(marker.getSnippet().equalsIgnoreCase(anObject.getID())) {
//you got at match
}
}
答案 2 :(得分:1)
根据以下链接的讨论,Marker.equals和Marker.hashCode有时不起作用。例如,当平移或缩放地图时,或者重新启动/恢复地图时。
Add Tag / Identifier to Markers
因此,对于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);
答案 3 :(得分:0)
我认为使用纬度和经度,可以这样做
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;
}
此方法会返回您ArrayList
所点击的Marker
的位置。你可以从那个位置获得数据。
希望它有所帮助...
答案 4 :(得分:0)
我迟到4年才回答,但我真的很惊讶为什么没有人谈论marker.setTag
和marker.getTag
方法。
正如谷歌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;
}
});