Why Custom InfoWindow of google map v2 ,Not load u

2019-04-01 18:06发布

问题:

I am developing app using Google map v2,In app,there is custom info window,which is not loading image from URL (loading by image Loader) please see attached image for more clearance. My code is here-

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;

}

}

this adapter call after data downloaded from server as like-

@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);
            }
        }

    }

I have seen this stackoverflow discussion

Android Google maps APIv2 InfoWindow and Markers

but unable to solve my problem please anyone guide me.

回答1:

The Maps V2 UI is actually rendered by another process. You cannot modify the View you use for your info window after you pass that View to Maps V2. My guess is that you are trying to set up the View, then load the image later on, and that will not work. Get the image first, then put it into the View before you give the View to Maps V2.

This, of course, was covered in the answer that you linked to.



回答2:

The Google has updated his MAP(Android) with many features, increase performance etc.. He Replace GeoPoint to LatLng (Data type for location Latitude). Also some change for developers between MAP v1 and v2

How to load Dynamic Image in InfoWindow

Once InfoWindow view is created Google cant access to modify or change this view. But you can try this

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
}


回答3:

When you set
myMap.setInfoWindowAdapter(new CustomWindowAdapter(MainActivity.this,mapList));

just make a constructor in CustomInfoWindowAdapter

private Marker 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;
        }

    }


标签: android map