I am using universal-image-loader-1.9.5.jar
. I am trying to display user image on marker. But image is not being displayed.
What have i done .
UIL initialization
imageLoader = ImageLoader.getInstance();
defaultOptions = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.profile_image) // resource or drawable
.showImageForEmptyUri(R.drawable.profile_image) // resource or drawable
.showImageOnFail(R.drawable.profile_image) // resource or drawable
.resetViewBeforeLoading(false) // default
.delayBeforeLoading(1000)
.cacheInMemory(false) // default
.cacheOnDisk(false) // default
.considerExifParams(false) // default
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default
.bitmapConfig(Bitmap.Config.ARGB_8888) // default
.displayer(new SimpleBitmapDisplayer()) // default
.handler(new Handler()) // default
.build();
File cacheDir = StorageUtils.getCacheDirectory(this);
config = new ImageLoaderConfiguration.Builder(this)
.memoryCacheExtraOptions(480, 800) // default = device screen dimensions
.diskCacheExtraOptions(480, 800, null)
.threadPoolSize(3) // default
.threadPriority(Thread.NORM_PRIORITY - 2) // default
.tasksProcessingOrder(QueueProcessingType.FIFO) // default
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new LruMemoryCache(2 * 1024 * 1024))
.memoryCacheSize(2 * 1024 * 1024)
.memoryCacheSizePercentage(13) // default
.diskCache(new UnlimitedDiskCache(cacheDir)) // default
.diskCacheSize(50 * 1024 * 1024)
.diskCacheFileCount(100)
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
.writeDebugLogs()
.build();
imageLoader.init(config);
Using InfoWindowAdapter
googleMap.setInfoWindowAdapter(new MyCustomAdapterForItems());
public class MyCustomAdapterForItems implements InfoWindowAdapter {
private final View myContentsView;
MyCustomAdapterForItems() {
myContentsView = mainFragmentActivity.getLayoutInflater().inflate(
R.layout.map_info_window_dialog, null);
}
@Override
public View getInfoContents(Marker marker) {
return null;
}
@Override
public View getInfoWindow(Marker marker) {
try {
JSONObject jsonMarker = new JSONObject(marker.getSnippet());
String name = jsonMarker.getString("name");
double distance = jsonMarker.getDouble("distance");
String imagePath = jsonMarker.getString("profile_pic_address");
String gender = jsonMarker.getString("gender");
String birthDate = jsonMarker.getString("birthdate");
age = hiApplication.getAge(birthDate);
TextView tvName = ((TextView) myContentsView
.findViewById(R.id.tvMapChatName));
TextView tvAge = ((TextView) myContentsView
.findViewById(R.id.tvMapChatAge));
TextView tvDistance = ((TextView) myContentsView
.findViewById(R.id.distance));
TextView tvGender = (TextView) myContentsView.findViewById(R.id.tvChatGender);
RoundedImageView image = (RoundedImageView) myContentsView.findViewById(R.id.profile_pic);
imageLoader.displayImage(imagePath, image , defaultOptions , simpleLoader); //Image loading here
tvName.setText(name);
if(age == 0 ) tvAge.setText("");
else tvAge.setText(age+"");
tvGender.setText(gender);
tvDistance.setText(new DecimalFormat("##.##").format(distance)+ " km.");
} catch (JSONException e) {
e.printStackTrace();
}
return myContentsView;
}
}
ImageLoadingListener
private class SimpleLoader implements ImageLoadingListener {
@Override
public void onLoadingCancelled(String arg0, View arg1) {
Log.d("d", "image cancelled");
}
@Override
public void onLoadingComplete(String arg0, View view, Bitmap bitmap) {
Log.d("d", "loading complete");
ImageView imageView = (ImageView) view;
imageView.setImageBitmap(bitmap);
}
@Override
public void onLoadingFailed(String arg0, View arg1, FailReason arg2) {
Log.d("d", "image loading failed");
}
@Override
public void onLoadingStarted(String arg0, View arg1) {
Log.d("d", "image loading started");
}
}
Although my logs show that image is loaded completely . Here is my logs .
01-21 02:38:13.561: D/d(7832): image loading started
01-21 02:38:13.567: D/ImageLoader(7832): Delay 1000 ms before loading... [http://192.168.1.9:8080/chatme_userimages/[email protected]_100x100]
01-21 02:38:14.568: D/ImageLoader(7832): Start display image task [http://192.168.1.9:8080/chatme_userimages/[email protected]_100x100]
01-21 02:38:14.569: D/ImageLoader(7832): Load image from network [http://192.168.1.9:8080/chatme_userimages/[email protected]_100x100]
01-21 02:38:14.653: D/ImageLoader(7832): Display image in ImageAware (loaded from NETWORK) [http://192.168.1.9:8080/chatme_userimages/[email protected]_100x100]
01-21 02:38:14.653: D/d(7832): loading complete
But only default drawb R.drawable.profile_image
is showing all the time.
Can anybody tell me , am i missing something here ? Whats wrong with code ?
I have found a solution of my problem , following some suggestions from Dynamic contents in Maps V2 InfoWindow
The problem with above code is getInfoWindow(Marker marker)
is being called before downloading the image hence it was not showing updated UI.
So i am updating infowindow() using marker.showInfoWindow()
and marker.hideInfoWindow()
after image downloaded .
I have done following changes in my code .
@Override
public View getInfoContents(Marker marker) {
if ( FragmentMap.this.marker != null && FragmentMap.this.marker.isInfoWindowShown()) {
FragmentMap.this.marker.hideInfoWindow();
FragmentMap.this.marker.showInfoWindow();
FragmentMap.this.marker = null ;
}
return null;
}
@Override
public View getInfoWindow(Marker marker) {
try {
Log.d("d", "inside getinfowindow");
FragmentMap.this.marker = marker;
JSONObject jsonMarker = new JSONObject(marker.getSnippet());
String name = jsonMarker.getString("name");
double distance = jsonMarker.getDouble("distance");
String imagePath = jsonMarker.getString("profile_pic_address");
String gender = jsonMarker.getString("gender");
String birthDate = jsonMarker.getString("birthdate");
age = hiApplication.getAge(birthDate);
TextView tvName = ((TextView) myContentsView
.findViewById(R.id.tvMapChatName));
TextView tvAge = ((TextView) myContentsView
.findViewById(R.id.tvMapChatAge));
TextView tvDistance = ((TextView) myContentsView
.findViewById(R.id.distance));
TextView tvGender = (TextView) myContentsView.findViewById(R.id.tvChatGender);
RoundedImageView image = (RoundedImageView) myContentsView.findViewById(R.id.profile_pic);
imageLoader.displayImage(imagePath, image , defaultOptions , simpleLoader);
tvName.setText(name);
if(age == 0 ) tvAge.setText("");
else tvAge.setText(age+"");
tvGender.setText(gender);
tvDistance.setText(new DecimalFormat("##.##").format(distance)+ " km.");
} catch (JSONException e) {
e.printStackTrace();
}
return myContentsView;
}
Inside class SimpleLoader
@Override
public void onLoadingComplete(String arg0, final View view, Bitmap bitmap) {
markerCustomAdapter.getInfoContents(marker);
}
UPDATE
Above code is working fine on android 4.0.4 , but when i tried this code on android lolipop, images were not getting loaded. So i followed Add an Image from url into custom InfoWindow google maps v2 and used http://square.github.io/picasso/ Picasso library . Now its working fine for me.
Thanks all.