Java android:3个不同的标记在单击内部类时具有相同的数据
我在地图上有三个标记。我通过服务器获取标记数据,并通过每个标记将其关联起来。由于数据量,我只得到每个标记的数据子集(对于开发,我有3个标记,但可能还有更多)。因此,我将一个ID与每个标记关联,对于下一个活动,我获取该ID并检索下一个要显示的活动的完整数据集 不幸的是,所有标记最终都与相同的ID相关联。我错过了什么 最初,我将Java android:3个不同的标记在单击内部类时具有相同的数据,java,android,google-maps,inner-classes,Java,Android,Google Maps,Inner Classes,我在地图上有三个标记。我通过服务器获取标记数据,并通过每个标记将其关联起来。由于数据量,我只得到每个标记的数据子集(对于开发,我有3个标记,但可能还有更多)。因此,我将一个ID与每个标记关联,对于下一个活动,我获取该ID并检索下一个要显示的活动的完整数据集 不幸的是,所有标记最终都与相同的ID相关联。我错过了什么 最初,我将final变量传递给内部类以分配ID。发现这个问题:(很好!)我向内部类引入了一个初始值设定项,认为final属性可能就是问题所在。但是没有。所有标记上的ID仍然相同
final
变量传递给内部类以分配ID。发现这个问题:(很好!)我向内部类引入了一个初始值设定项,认为final
属性可能就是问题所在。但是没有。所有标记上的ID仍然相同
private class Getter extends AsyncTask<String, Void, JSONArray> {
private Exception exception;
protected static final String TAG = "Getter";
protected JSONArray doInBackground(String... urls) {
try {
try {
//get JSON data from server
return json_objects.getJSONArray("objects");
} catch (JSONException jse) {
//more error handling
}
}catch(Exception e) {
this.exception = e;
return null;
}
}
protected void onPostExecute(JSONArray obj_arr) {
try {
if (this.exception != null) {
//some error handling
} else if (obj_arr != null) {
for (int i = 0; i < obj_arr.length(); i++) {
JSONObject obj = obj_arr.getJSONObject(i);
create_marker(obj);
}
}
} catch(JSONException jse) {
//error handling
}
}
private void create_marker(JSONObject obj) {
try {
JSONObject location = obj.getJSONObject("location");
double lat = location.getDouble("lat");
double lng = location.getDouble("lng");
String id = obj.getString("id");
LatLng pos = new LatLng(lat, lng);
mMap.addMarker(new MarkerOptions().position(
pos).title(obj.getString("name")).
mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
String local_id;
public GoogleMap.OnMarkerClickListener init(String id) {
local_id = id;
return this;
}
@Override
public boolean onMarkerClick(Marker marker) {
Intent i = new Intent(MapActivity.this, NextActivity.class);
i.putExtra("obj_id", local_id);
startActivity(i);
return false;
};
}.init(id));
} catch (JSONException e) {
//error handling
}
}
}
私有类Getter扩展异步任务{
私人例外;
受保护的静态最终字符串标记=“Getter”;
受保护的JSONArray doInBackground(字符串…URL){
试一试{
试一试{
//从服务器获取JSON数据
返回json_objects.getJSONArray(“objects”);
}捕获(JSONException jse){
//更多错误处理
}
}捕获(例外e){
这个异常=e;
返回null;
}
}
受保护的void onPostExecute(JSONArray obj_arr){
试一试{
if(this.exception!=null){
//一些错误处理
}如果(obj_arr!=null){
对于(int i=0;i
看起来像onMarkerClick
处理程序只能访问最后一个本地\u id-构造函数是否没有为每个匿名侦听器构造新实例?阻止它。我现在意识到侦听器在地图上,而不是标记上…我需要一种不同的方法。找到解决方案后发布解决方案。当然,它只会在非常及时。因为监听器可能只调用一次。如果您只想将Id(或将来的对象)与单击的标记关联。只需实现WeakHashMap markerMap
,并在每次将标记项添加到对象映射时放置标记项,在您的情况下,它将是Id。yes@user370305我发现一个链接正在这样做。:)