9

나는 Google Maps Android API Utility Library을 사용 중이며 인터넷에서 마커로 사용하려는 특정 이미지를 다운로드하고 있습니다. 내가하고 있어요 방법은 다음 코드에서와 같다 :Android 용 Google지도 v2의 리프레싱 메이커 (ClusterItems)

class MarkerItemClusterRenderer extends DefaultClusterRenderer<MarkerItem> { 
... 
    @Override 
     protected void onBeforeClusterItemRendered(MarkerItem item, 
       final MarkerOptions markerOptions) { 
      super.onBeforeClusterItemRendered(item, markerOptions); 
      mImageLoader.get(item.getImageUrl(), new ImageListener() { 

       @Override 
       public void onErrorResponse(VolleyError error) { 
        Log.i("XXX", error.toString()); 
       } 

       @Override 
       public void onResponse(ImageContainer response, boolean isImmediate) { 
        if (response != null && response.getBitmap() != null) { 
         mImageIcon.setImageBitmap(response.getBitmap()); 
         Bitmap icon = mIconGenerator.makeIcon(); 
         Bitmap bhalfsize = Bitmap.createScaledBitmap(icon, 150, 
           150, false); 
         markerOptions.icon(BitmapDescriptorFactory 
           .fromBitmap(bhalfsize)); 
        } 
       } 
      }); 
     } 

문제는 이미지가 다운로드 될 때,지도 (따라서 마커), 새로 고침하지 않는,있는 대부분 그렇게 시간 (하지만 항상 그런 것은 아닙니다) 나는 여전히 빨간색 기본 마커를 보았습니다.

나는 mImageIcon.invalidate(); mImageIcon.requestLayout();을 시도했지만 여전히 운이 없다.

어쨌든 이것을 달성 할 수 있습니까? 미리 감사드립니다.

답변

0

GoogleMap 객체를 다음과 같이 선언했다고 가정 해 보겠습니다. 비공개 GoogleMap mMap;

마커에 변경 사항을 적용하기 전에 onResponse() 메서드에서 이전 마커를 지우려면 다음 문을 작성하십시오. mMap.clear();

이제 새 마커를 설정하십시오.

0

나는 조금 늦었을지 모르지만 나는 누군가와 같은 해결책을 찾고자 할 때 유용 할 수있다. 기본적으로해야 할 일은 ClusterItem이 아닌 마커를 새로 고치는 것입니다. 그러나 중요한 데이터를 저장하기 위해 내 ClusterItem 구현을 사용했습니다. 우리의 물건을 기억 유용한 몇 가지 매개 변수가 있어야합니다

LatLngBounds bounds = map.getProjection().getVisibleRegion().latLngBounds; //take visible region on map 
if(bounds.contains(item.getPosition()) && !item.hasImage()) { //if item is not inside that region or it has an image already don't load his image 
    mImageLoader.get(item.getImageUrl(), new ImageListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       Log.i("XXX", error.toString()); 
      } 

      @Override 
      public void onResponse(ImageContainer response, boolean isImmediate) { 
       if (response != null && response.getBitmap() != null) { 
        mImageIcon.setImageBitmap(response.getBitmap()); 
        Bitmap icon = mIconGenerator.makeIcon(); 
        Bitmap bhalfsize = Bitmap.createScaledBitmap(icon, 150, 
          150, false); 

        //Set has image flag 
        item.setHasImage(true); 

        //Find the right marker 
        MarkerManager.Collection markerCollection = mClusterManager.getMarkerCollection(); 
        Collection<Marker> markers = markerCollection.getMarkers(); 
        for (Marker m : markers) { 
         if (id.equals(m.getTitle())) { 
          //set the icon 
          m.setIcon(BitmapDescriptorFactory.fromBitmap(image)); 
          break; 
         } 
        } 
       } 
      } 
    }); 
} 

그리고 당신의 MyItem 클래스 : 그래서 onBeforeClusterItemRendered 내부 코드는 다음과 같이된다

public class MyItem implements ClusterItem { 

private String itemId; 
private LatLng mPosition; 
private WMWall wall; 
private boolean hasImage = false; 

public MyItem(double latitude, double longitude) { 
    mPosition = new LatLng(latitude, longitude); 
} 

@Override 
public LatLng getPosition() { 
    return mPosition; 
} 

public WMWall getWall() { 
    return wall; 
} 

public void setWall(WMWall wall) { 
    this.wall = wall; 
} 

public String getItemId() { 
    return itemId; 
} 

public void setItemId(String itemId) { 
    this.itemId = itemId; 
} 

public boolean hasImage() { 
    return hasImage; 
} 

public void setHasImage(boolean hasImage) { 
    this.hasImage = hasImage; 
} 
} 

을이의 이미지를로드하는 데 정말 중요하다 경계에 포함 된 마커, 그렇지 않으면 OOM을 실행하게됩니다. hasImage() 메서드가 true를 반환하면 이미지가 이미 마커 개체에 저장되어 있기 때문에 이미지를 다시로드 할 필요가 없습니다.

2

당신은 당신이 비동기 콜백 MarkerOptions에 아이콘을 설정 onBeforeClusterItemRendered에서

protected void onClusterItemRendered(T clusterItem, Marker marker) { 
    ... 
} 

이 모든 물건을 확인해야합니다. 현재지도에 추가하여 실제 Marker이 될 수 있습니다. 그래서 아이콘은 이미 쓸모없는 객체로 설정됩니다.

그래서 당신이 그것을해야합니다. onClusterItemRendered

+0

이 wokrs 나를 위해. –

관련 문제