【问题标题】:Why Custom InfoWindow of google map v2 ,Not load url Image?为什么谷歌地图 v2 的自定义信息窗口,不加载 url 图片?
【发布时间】:2014-12-15 20:57:25
【问题描述】:

我正在使用谷歌地图 v2 开发应用程序,在应用程序中,有自定义信息窗口,它不是从 URL 加载图像(通过图像加载器加载),请参阅附图以获得更多许可。 我的代码在这里-

public class CustomWindowAdapter implements InfoWindowAdapter {
private Activity objactivity;
private List<GroupDealModle> mapList;

public CustomWindowAdapter(Activity objactivity,
        List<GroupDealModle> mapList) {
    this.objactivity = objactivity;
    this.mapList = mapList;
}

@Override
public View getInfoContents(Marker objmarker) {
    return null;
}

@Override
public View getInfoWindow(Marker objmarker) {
    View objview  = render(objmarker);
    return objview;
}

private View  render(Marker objmarker) {
    ImageLoader objloader = new ImageLoader(objactivity);
    View view = null;
    if (!objmarker.getTitle().equals("")) {
        int pos = Integer.parseInt(objmarker.getTitle());
        Log.e("==check position==", "" + pos);
        if (mapList != null && mapList.size() > pos) {
            String countvalue = mapList.get(pos).getCount();
            Log.e("==check count==", "" + countvalue);
            if (countvalue.equalsIgnoreCase("1")) {
                LayoutInflater inflater = (LayoutInflater) objactivity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                view = inflater.inflate(R.layout.balloon_overlay, null, false);
                TextView objbusname = (TextView) view
                        .findViewById(R.id.balloon_item_title);
                TextView objballoon_item_desc = (TextView) view
                        .findViewById(R.id.balloon_item_desc);
                TextView objtitle = (TextView) view
                        .findViewById(R.id.balloon_item_snippet);
                ImageView objimgview = (ImageView) view
                        .findViewById(R.id.userthumb_inbaloon);
                TextView objtextexpired = (TextView) view
                        .findViewById(R.id.textexpired);

                objbusname.setText(mapList.get(pos).getBussiness_name());
                String expirevalue = mapList.get(pos).getExpire_status();
                if (expirevalue != null && expirevalue.equals("1")) {
                    objtextexpired.setVisibility(View.VISIBLE);
                }
                if (expirevalue != null && expirevalue.equals("0")) {
                    objtextexpired.setVisibility(View.GONE);
                }

                objtitle.setText(mapList.get(pos).getDeal_title());
                objballoon_item_desc.setText(mapList.get(pos)
                        .getDescription());
                String imageurl = mapList.get(pos).getImage();
                objloader.DisplayBanner(AppConstants.BASE_URL + imageurl,
                        objimgview, 65, 65);
            } else {
                LayoutInflater inflater = (LayoutInflater) objactivity
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                view = inflater.inflate(R.layout.transparentview, null, false);
                view.setVisibility(View.GONE);
                String userid = mapList.get(pos).getUser_id();
                LatLng objlatlng = objmarker.getPosition();
                double latitude = objlatlng.latitude;
                double longitude = objlatlng.longitude;
                Bundle objbundle = new Bundle();
                Intent objintent = new Intent(objactivity,
                        com.flashdeal.map.MapGroupData.class);
                objbundle.putString("from", "map");
                objbundle.putString("lat", "" + latitude);
                objbundle.putString("longi", "" + longitude);
                objbundle.putString("userid", "" + userid);
                objintent.putExtras(objbundle);
                objactivity.startActivity(objintent);
            }
        }
    }
    return view;

}

}

从服务器下载数据后,此适配器调用-

@Override
    protected void onPostExecute(List<GroupDealModle> result) {
        if (objprogress.isShowing()) {
            objprogress.dismiss();
        }
        if (result != null) {
            mapList = result;
            myMap.setInfoWindowAdapter(new CustomWindowAdapter(MainActivity.this,mapList));

            if (result.size() != 0) {
                if (result != null) {
                    addPins(result);
                }
            } else if (frommovecurrent != null
                    && frommovecurrent.equalsIgnoreCase("yes")) {
                frommovecurrent = "no";
                addSingleMarker();
                addPins(result);

                /*
                 * // objLayout . removeAllViews (); // objLayout .addView(
                 * objviewformap ); objMapViewhelper . clearMap( );
                 * AlertDialog .Builder objbuilder = new AlertDialog
                 * .Builder( MainActivity .this); objbuilder . setMessage (
                 * "No deals found" ); objbuilder . setPositiveButton ("ok",
                 * new DialogInterface . OnClickListener () {
                 * 
                 * @Override public void onClick( DialogInterface arg0, int
                 * arg1) { } }); objbuilder . create(); objbuilder .show();
                 */
            } else if (result.size() == 0) {
                addSingleMarker();
                addPins(result);
            }
        }

    }

我看过这个 stackoverflow 讨论

Android Google maps APIv2 InfoWindow and Markers

但无法解决我的问题,请任何人指导我。

【问题讨论】:

    标签: android map


    【解决方案1】:

    Maps V2 UI 实际上是由另一个进程呈现的。将 View 传递给 Maps V2 后,您无法修改用于信息窗口的 View。我的猜测是您正在尝试设置View然后稍后加载图像,这将不起作用。先获取图像,然后将其放入View,然后再将View 提供给Maps V2。

    这当然包含在您链接到的答案中。

    【讨论】:

      【解决方案2】:

      Google 已经更新了他的 MAP(Android) 的许多功能,提高了性能等。 他将 GeoPoint 替换为 LatLng(位置纬度的数据类型)。 MAP v1 和 v2 之间的开发人员也有一些变化

      如何在 InfoWindow 中加载动态图像

      创建 InfoWindow 视图后,Google 无法访问以修改或更改此视图。不过你可以试试这个

      static HashMap<String,String> loadImagesFlag = new HashMap<String, String>();
      
      */*create a AsyncTask for load image asynchronously */*
      
      public class FetchImageTask extends AsyncTask<String, Integer, Bitmap> 
      {
      
              @Override
              protected Bitmap doInBackground(String... arg0) {
                  Bitmap b = null;
                  try {
                      Thread.sleep(500);
                      b = BitmapFactory.decodeStream((InputStream) new URL(arg0[0]).getContent());
                  } catch (MalformedURLException e) {
                      //e.printStackTrace();
                  } catch (IOException e) {
                      //e.printStackTrace();
                  }catch (Exception e){
                      e.printStackTrace();
                  }
                  return b;
              }
      }
      
      public View getInfoWindow(final Marker marker){
      
            View view = getLayoutInflater().inflate(R.layout.custome_infowindow, null);
            ImageView driverImage = (ImageView) view.findViewById(R.id.img_driverphoto);
           /* Check this image is already load or not */
           if (DriverImageDTO.isLoadImage(driverName)) {
                /*set Image which is already loaded */
                driverImage.setImageBitmap(DriverImageDTO.DImage);
           }
           else if (!loadImagesFlag.containsKey(driverName)){
              final String vName = driverName;
              /* create HashMap to check status of Image is Load or not */
               loadImagesFlag.put(driverName,"true");
               new com.intelisky.FetchImageTask() {
                   protected void onPostExecute(Bitmap result) {
                       if (result != null) {
                          try {
                              if(DriverImageDTO.driverimagelist==null){
                                  DriverImageDTO.driverimagelist = new ArrayList<DriverImageDTO>();
                                              }
                                  DriverImageDTO.driverimagelist.add(new DriverImageDTO(driverName, result));
                                              marker.setVisible(true);
                                              marker.hideInfoWindow();
                                              getInfoWindow(marker);
                                              marker.showInfoWindow();
                                          } catch (Exception e) {
                                              e.printStackTrace();
                                          }
                                      }
                                  }
                              }.execute(imageurl));
                          }
      
           return view
      }
      

      【讨论】:

      • 这会导致 FetchImageTask 被多次调用吗??
      • 否 一旦图像加载到内存中,我们就使用它。
      【解决方案3】:

      当你设置
      myMap.setInfoWindowAdapter(new CustomWindowAdapter(MainActivity.this,mapList));

      只需在 CustomInfoWindowAdapter 中创建一个构造函数

      私人标记 mymarker;

       private class CustomInfoWindowAdapter implements InfoWindowAdapter {
      
                  private View view;
      
                  public CustomInfoWindowAdapter() {
      
                      view = getActivity().getLayoutInflater().inflate(
      
                      R.layout.group_custom_infowindow, null);
                  }
      
      
          @Override
              public View getInfoContents(Marker marker) {
      
                   if (mymarker != null
                          && mymarker
                                  .isInfoWindowShown()) {
      
                      mymarker.showInfoWindow();
                  }
      
      
              return null;
          }
      
      
      @Override
              public View getInfoWindow(final Marker marker) {
      
            mymarker = marker;
      
      
                  String url = get url of image
      
                  final ImageView image = ((ImageView) view.findViewById(R.id.badge));
      
                  if (url != null && !url.equalsIgnoreCase("null")
                          && !url.equalsIgnoreCase("")) {
                      imageLoader.displayImage(url, image, options,
                              new SimpleImageLoadingListener() {
                                  @Override
                                  public void onLoadingComplete(String imageUri,
                                          View view, Bitmap loadedImage) {
                                      super.onLoadingComplete(imageUri, view,
                                              loadedImage);
                                      getInfoContents(marker);
                                  }
                              });
                  } else {
                      image.setImageResource(R.drawable.ic_stub);
                  }
      
      
                  return view;
              }
      
          }
      

      【讨论】:

        猜你喜欢
        • 2013-01-06
        • 1970-01-01
        • 1970-01-01
        • 2013-06-28
        • 1970-01-01
        • 2013-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多