Java android:3个不同的标记在单击内部类时具有相同的数据

Java android:3个不同的标记在单击内部类时具有相同的数据,java,android,google-maps,inner-classes,Java,Android,Google Maps,Inner Classes,我在地图上有三个标记。我通过服务器获取标记数据,并通过每个标记将其关联起来。由于数据量,我只得到每个标记的数据子集(对于开发,我有3个标记,但可能还有更多)。因此,我将一个ID与每个标记关联,对于下一个活动,我获取该ID并检索下一个要显示的活动的完整数据集 不幸的是,所有标记最终都与相同的ID相关联。我错过了什么 最初,我将final变量传递给内部类以分配ID。发现这个问题:(很好!)我向内部类引入了一个初始值设定项,认为final属性可能就是问题所在。但是没有。所有标记上的ID仍然相同

我在地图上有三个标记。我通过服务器获取标记数据,并通过每个标记将其关联起来。由于数据量,我只得到每个标记的数据子集(对于开发,我有3个标记,但可能还有更多)。因此,我将一个ID与每个标记关联,对于下一个活动,我获取该ID并检索下一个要显示的活动的完整数据集

不幸的是,所有标记最终都与相同的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我发现一个链接正在这样做。:)