Hello Am facing a particular problem in which I need to download images and display them onto a ListView
corresponding to their particular TextView\'s
Here's how I load and cache images in a ListView
that creates a contact list for the user. So imagine profile picture on the left, some text views on the right (which sounds close to the problem you're dealing with. Ignore the ugly debug tags and probably poor formatting (sorry). I guess this is kind of like LazyList but here's a detailed explanation in case anyone was confused.
Step 1: Set Up Your Cache
private LruCache<String, Bitmap> memoryCache;
private HashMap<String, String> idPairs = new HashMap<String, String>();
In my approach I use an LruCache
and a HashMap
to track which user's images I've downloaded. You'll see how its implemented later but the idea is to avoid downloading stuff from the server unless you have to. Then in your onCreate()
or some related method, initialize your cache.
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int cacheSize = maxMemory / 8;
memoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap){
return (bitmap.getRowBytes() * bitmap.getHeight()) / 1024; //don't use getByteCount for API < 12
}
};
My next step is to add the default "empty image" bitmap to the cache in case I reach an entry that does not have a picture associated with it. That way I only have to process and add this bitmap once
Bitmap defaultPicture = BitmapFactory.decodeResource(getResources(), R.drawable.default_user_picture);
addBitmapToMemoryCache("default", defaultPicture);
Then its time to get the data you need for the list!
Step 2: Get The Data
private class GetPeopleData extends AsyncTask<JSONArray, Void, Void> {
@Override
protected Void doInBackground(JSONArray...lists) {
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost();
ResponseHandler <String> responseHandler = new BasicResponseHandler();
if(DEBUG) Log.d("GET PEOPLE DATA TASK", lists[0].length() + " users");
getUsers(lists[0], httpClient, httpPost, responseHandler);
return null;
}
@Override
protected void onPostExecute(Void result){
updateUserListView();
}
}
Here's a borring AsyncTask
that takes a JSONArray
of user data as an argument. I left out that part because it's pretty much just a basic HTTP download that doesn't need explanation. The getUsers method is where I start to put together what will be added to my ListView
. What I do next is process the JSON downloaded from the server to create user objects that will be added it to a list of users that will be displayed.
private void getUsers(JSONArray userArray, HttpClient httpClient, HttpPost httpPost, ResponseHandler<String> responseHandler){
if(DEBUG) Log.d("USERS ARRAY", userArray.length() + " users");
try{
users = new ArrayList<User>();
if(DEBUG) Log.d("User Array -START", "" + users.size());
//Go through userArray and get information needed for list
for(int i = 0; i < userArray.length(); i++){
User u = new User();
if(DEBUG) Log.d("User Array - ADD USER", "" + users.size());
String profileId = userArray.getJSONObject(i).getString("profileid");
u.setId(userArray.getJSONObject(i).getString("id"));
u.setDisplayName(userArray.getJSONObject(i).getString("displayname"));
u.setStatus(userArray.getJSONObject(i).getString("status"));
//check HashMap for sender/profileid pair
if(idPairs.containsKey(profileId)){
if(DEBUG) Log.d("idPairs", "User in HashMap");
profileId = idPairs.get(profileId);
} else {
if(DEBUG) Log.d("idPairs", "User not in HashMap. Add profileId");
idPairs.put("profileId", profileId);
}
u.setProfilePicture(getProfilePictureFromCache(profileId, httpClient, httpPost, responseHandler)); //check cache for image
users.add(u);
if(DEBUG) Log.d("User info", u.toString());
}
} catch (Exception e) {
Log.e("BACKGROUND_PROC", e.getMessage());
}
}
I associate the picture with the user object that will eventually be displayed. I figure this isn't a total waste of time since the image is pulled from the bitmap cache
private Bitmap getProfilePictureFromCache(String profileId, HttpClient httpClient, HttpPost httpPost, ResponseHandler<String> responseHandler){
Bitmap defaultPicture = getBitmapFromMemCache("default");
Bitmap profilePicture = getBitmapFromMemCache(profileId);
if(profilePicture != null){
return profilePicture;
} else {
String pictureString = getProfilePic(profileId, httpClient, httpPost, responseHandler);
if(!pictureString.isEmpty()){
byte[] decodedString = Base64.decode(pictureString, Base64.DEFAULT);
profilePicture = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
addBitmapToMemoryCache(profileId, profilePicture);
if(DEBUG) Log.d("MEMCACHE", "Download and store picture for " + profileId);
return profilePicture;
} else if (defaultPicture != null && pictureString.equals(null)) {
if(DEBUG) Log.d("MEMCACHE", "Load default picture");
return defaultPicture;
}
}
return defaultPicture;
}
If a picture exists in the cache it is returned, if not it is downloaded. For me, displaying users, each picture is cached according to userid so even if someone were to appear more than once in the list, there would only be one picture stored in the cache for that user.
ImageView profile_picture = (ImageView) v.findViewById(R.id.profile_picture);
if(profile_picture != null){
profile_picture.setImageBitmap(u.getProfilePicture());
}
The only thing left to do is find the ImageView
in your adapter and set that view to the picture you associated with the object in your list.
Please try this with universal image loader
public class DetailsListViewAdapter extends ArrayAdapter<Entry>{
private Context context;
private List<Entry> detailList;
DisplayImageOptions options;
public ImageLoader imageLoader;
public DetailsListViewAdapter(Context context, int textViewResourceId,List<Entry> detailList) {
super(context, textViewResourceId,detailList);
this.detailList = detailList;
this.context = context;
imageLoader = ImageLoader.getInstance();
imageLoader.init(ImageLoaderConfiguration.createDefault(context));
options = new DisplayImageOptions.Builder()
.showImageForEmptyUri(R.drawable.blankimage)
.showImageOnFail(R.drawable.blankimage)
.resetViewBeforeLoading()
.cacheOnDisc()
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.bitmapConfig(Bitmap.Config.RGB_565)
.displayer(new FadeInBitmapDisplayer(300))
.build();
}
static class ViewHolder{
private TextView popupDetails;
private TextView pubDate;
private ImageView image;
private ProgressBar progress;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
ViewHolder holder;
if (v == null) {
LayoutInflater vi = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.details_list_item, null);
holder = new ViewHolder();
holder.popupDetails=(TextView)v.findViewById(R.id.detailHeading);
holder.pubDate = (TextView)v.findViewById(R.id.pubDate);
holder.image = (ImageView)v.findViewById(R.id.listImg);
holder.progress = (ProgressBar)v.findViewById(R.id.progressBar);
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
Entry value = detailList.get(position);
holder.popupDetails.setText(value.getTitle());
holder.pubDate.setText(value.getPubDate());
String url = value.getImageLink();
try {
if(url.length() > 5) {
holder.image.setVisibility(View.VISIBLE);
loadImage(holder.image,url,holder.progress);
} else {
if(url.equals("NO")) {
holder.image.setVisibility(View.INVISIBLE);
} else {
holder.image.setVisibility(View.GONE);
}
}
} catch (Exception e) {
Logger.show(e);
}
v.setBackgroundColor(Color.WHITE);
return v;
}
public void loadImage(ImageView imageView, String loadURL,final ProgressBar progress) {
imageLoader.displayImage(loadURL, imageView, options, new SimpleImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
progress.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
String message = null;
switch (failReason) {
case IO_ERROR:
message = "Input/Output error";
break;
case OUT_OF_MEMORY:
message = "Out Of Memory error";
break;
case NETWORK_DENIED:
message = "Downloads are denied";
break;
case UNSUPPORTED_URI_SCHEME:
message = "Unsupported URI scheme";
break;
case UNKNOWN:
message = "Unknown error";
break;
}
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
}
@Override
public void onLoadingComplete(final String imageUri, View view, final Bitmap loadedImage) {
progress.setVisibility(View.INVISIBLE);
}
});
}
}
Lazy loading using Universal Imageloader. Replace the hardcoded urls with url of images.
Modify the below according to your requirements
What's LazyList?. Check this link for details.
public class MainActivity extends Activity {
private String[] mStrings={
"http://a3.twimg.com/profile_images/670625317/aam-logo-v3-twitter.png",
"http://a3.twimg.com/profile_images/740897825/AndroidCast-350_normal.png",
"http://a3.twimg.com/profile_images/121630227/Droid_normal.jpg",
"http://a1.twimg.com/profile_images/957149154/twitterhalf_normal.jpg",
"http://a1.twimg.com/profile_images/97470808/icon_normal.png",
"http://a3.twimg.com/profile_images/511790713/AG.png",
"http://a3.twimg.com/profile_images/956404323/androinica-avatar_normal.png",
"http://a1.twimg.com/profile_images/909231146/Android_Biz_Man_normal.png",
"http://a3.twimg.com/profile_images/72774055/AndroidHomme-LOGO_normal.jpg",
"http://a1.twimg.com/profile_images/349012784/android_logo_small_normal.jpg",
"http://a1.twimg.com/profile_images/841338368/ea-twitter-icon.png",
"http://a3.twimg.com/profile_images/64827025/android-wallpaper6_2560x160_normal.png",
"http://a3.twimg.com/profile_images/77641093/AndroidPlanet_normal.png",
"http://a1.twimg.com/profile_images/605536070/twitterProfilePhoto_normal.jpg",
"http://a1.twimg.com/profile_images/850960042/elandroidelibre-logo_300x300_normal.jpg",
"http://a1.twimg.com/profile_images/655119538/andbook.png",
"http://a3.twimg.com/profile_images/768060227/ap4u_normal.jpg",
"http://a1.twimg.com/profile_images/74724754/android_logo_normal.png",
"http://a3.twimg.com/profile_images/681537837/SmallAvatarx150_normal.png",
"http://a1.twimg.com/profile_images/63737974/2008-11-06_1637_normal.png",
"http://a3.twimg.com/profile_images/548410609/icon_8_73.png",
"http://a1.twimg.com/profile_images/612232882/nexusoneavatar_normal.jpg",
"http://a1.twimg.com/profile_images/213722080/Bugdroid-phone_normal.png",
"http://a1.twimg.com/profile_images/645523828/OT_icon_090918_android_normal.png",
"http://a3.twimg.com/profile_images/64827025/android-wallpaper6_2560x160_normal.png",
"http://a3.twimg.com/profile_images/77641093/AndroidPlanet.png",
"http://a1.twimg.com/profile_images/605536070/twitterProfilePhoto_normal.jpg",
"http://a1.twimg.com/profile_images/850960042/elandroidelibre-logo_300x300_normal.jpg",
"http://a1.twimg.com/profile_images/655119538/andbook_normal.png",
"http://a3.twimg.com/profile_images/511790713/AG_normal.png",
"http://a3.twimg.com/profile_images/956404323/androinica-avatar.png",
"http://a1.twimg.com/profile_images/909231146/Android_Biz_Man_normal.png",
"http://a3.twimg.com/profile_images/72774055/AndroidHomme-LOGO_normal.jpg",
"http://a1.twimg.com/profile_images/349012784/android_logo_small_normal.jpg",
"http://a1.twimg.com/profile_images/841338368/ea-twitter-icon_normal.png",
"http://a3.twimg.com/profile_images/64827025/android-wallpaper6_2560x160_normal.png",
"http://a3.twimg.com/profile_images/77641093/AndroidPlanet.png",
"http://a1.twimg.com/profile_images/605536070/twitterProfilePhoto_normal.jpg",
"http://a3.twimg.com/profile_images/64827025/android-wallpaper6_2560x160_normal.png",
"http://a3.twimg.com/profile_images/77641093/AndroidPlanet_normal.png",
"http://a1.twimg.com/profile_images/605536070/twitterProfilePhoto_normal.jpg",
"http://a1.twimg.com/profile_images/850960042/elandroidelibre-logo_300x300.jpg",
"http://a1.twimg.com/profile_images/655119538/andbook_normal.png",
"http://a3.twimg.com/profile_images/511790713/AG_normal.png",
"http://a3.twimg.com/profile_images/956404323/androinica-avatar_normal.png",
"http://a1.twimg.com/profile_images/909231146/Android_Biz_Man_normal.png",
"http://a3.twimg.com/profile_images/121630227/Droid.jpg",
"http://a1.twimg.com/profile_images/957149154/twitterhalf_normal.jpg",
"http://a1.twimg.com/profile_images/97470808/icon_normal.png",
"http://a3.twimg.com/profile_images/511790713/AG_normal.png",
"http://a3.twimg.com/profile_images/956404323/androinica-avatar_normal.png",
"http://a1.twimg.com/profile_images/909231146/Android_Biz_Man.png",
"http://a3.twimg.com/profile_images/72774055/AndroidHomme-LOGO_normal.jpg",
"http://a1.twimg.com/profile_images/349012784/android_logo_small_normal.jpg",
"http://a1.twimg.com/profile_images/841338368/ea-twitter-icon_normal.png",
"http://a3.twimg.com/profile_images/64827025/android-wallpaper6_2560x160_normal.png",
"http://a3.twimg.com/profile_images/77641093/AndroidPlanet.png",
"http://a3.twimg.com/profile_images/670625317/aam-logo-v3-twitter_normal.png",
"http://a3.twimg.com/profile_images/740897825/AndroidCast-350_normal.png",
"http://a3.twimg.com/profile_images/121630227/Droid_normal.jpg",
"http://a1.twimg.com/profile_images/957149154/twitterhalf_normal.jpg",
"http://a1.twimg.com/profile_images/97470808/icon.png",
"http://a3.twimg.com/profile_images/511790713/AG_normal.png",
"http://a3.twimg.com/profile_images/956404323/androinica-avatar_normal.png",
"http://a1.twimg.com/profile_images/909231146/Android_Biz_Man_normal.png",
"http://a3.twimg.com/profile_images/72774055/AndroidHomme-LOGO_normal.jpg",
"http://a1.twimg.com/profile_images/349012784/android_logo_small_normal.jpg",
"http://a1.twimg.com/profile_images/841338368/ea-twitter-icon.png",
"http://a3.twimg.com/profile_images/64827025/android-wallpaper6_2560x160_normal.png",
"http://a3.twimg.com/profile_images/77641093/AndroidPlanet_normal.png",
"http://a1.twimg.com/profile_images/605536070/twitterProfilePhoto_normal.jpg",
"http://a1.twimg.com/profile_images/850960042/elandroidelibre-logo_300x300_normal.jpg",
"http://a1.twimg.com/profile_images/655119538/andbook_normal.png",
"http://a3.twimg.com/profile_images/768060227/ap4u_normal.jpg",
"http://a1.twimg.com/profile_images/74724754/android_logo.png",
"http://a3.twimg.com/profile_images/681537837/SmallAvatarx150_normal.png",
"http://a1.twimg.com/profile_images/63737974/2008-11-06_1637_normal.png",
"http://a3.twimg.com/profile_images/548410609/icon_8_73_normal.png",
"http://a1.twimg.com/profile_images/612232882/nexusoneavatar_normal.jpg",
"http://a1.twimg.com/profile_images/213722080/Bugdroid-phone_normal.png",
"http://a1.twimg.com/profile_images/645523828/OT_icon_090918_android.png",
"http://a3.twimg.com/profile_images/64827025/android-wallpaper6_2560x160_normal.png",
"http://a3.twimg.com/profile_images/77641093/AndroidPlanet_normal.png",
"http://a1.twimg.com/profile_images/605536070/twitterProfilePhoto_normal.jpg",
"http://a1.twimg.com/profile_images/850960042/elandroidelibre-logo_300x300_normal.jpg",
"http://a1.twimg.com/profile_images/655119538/andbook.png",
"http://a3.twimg.com/profile_images/511790713/AG_normal.png",
"http://a3.twimg.com/profile_images/956404323/androinica-avatar_normal.png",
"http://a1.twimg.com/profile_images/909231146/Android_Biz_Man_normal.png",
"http://a3.twimg.com/profile_images/72774055/AndroidHomme-LOGO_normal.jpg",
"http://a1.twimg.com/profile_images/349012784/android_logo_small_normal.jpg",
"http://a1.twimg.com/profile_images/841338368/ea-twitter-icon.png",
"http://a3.twimg.com/profile_images/64827025/android-wallpaper6_2560x160_normal.png",
"http://a3.twimg.com/profile_images/77641093/AndroidPlanet_normal.png",
"http://a1.twimg.com/profile_images/605536070/twitterProfilePhoto_normal.jpg",
"http://a3.twimg.com/profile_images/64827025/android-wallpaper6_2560x160_normal.png",
"http://a3.twimg.com/profile_images/77641093/AndroidPlanet_normal.png",
"http://a1.twimg.com/profile_images/605536070/twitterProfilePhoto.jpg",
"http://a1.twimg.com/profile_images/850960042/elandroidelibre-logo_300x300_normal.jpg",
"http://a1.twimg.com/profile_images/655119538/andbook_normal.png",
"http://a3.twimg.com/profile_images/511790713/AG_normal.png",
"http://a3.twimg.com/profile_images/956404323/androinica-avatar_normal.png",
"http://a1.twimg.com/profile_images/909231146/Android_Biz_Man_normal.png",
"http://a3.twimg.com/profile_images/121630227/Droid_normal.jpg",
"http://a1.twimg.com/profile_images/957149154/twitterhalf.jpg",
"http://a1.twimg.com/profile_images/97470808/icon_normal.png",
"http://a3.twimg.com/profile_images/511790713/AG_normal.png",
"http://a3.twimg.com/profile_images/956404323/androinica-avatar_normal.png",
"http://a1.twimg.com/profile_images/909231146/Android_Biz_Man_normal.png",
"http://a3.twimg.com/profile_images/72774055/AndroidHomme-LOGO_normal.jpg",
"http://a1.twimg.com/profile_images/349012784/android_logo_small.jpg",
"http://a1.twimg.com/profile_images/841338368/ea-twitter-icon_normal.png",
"http://a3.twimg.com/profile_images/64827025/android-wallpaper6_2560x160_normal.png",
"http://a3.twimg.com/profile_images/77641093/AndroidPlanet_normal.png"
};
ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv= (ListView) findViewById(R.id.lv);
lv.setAdapter(new LazyAdapter(this,mStrings));
}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ListView
android:id="@+id/lv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#000000"
android:focusableInTouchMode="false"
android:listSelector="@android:color/transparent"
android:layout_weight="2.0"
android:divider="#000000"
android:headerDividersEnabled="false"
android:footerDividersEnabled="false"
android:dividerHeight="8dp"
android:drawSelectorOnTop="false"
/>
</RelativeLayout>
public class LazyAdapter extends BaseAdapter {
private Activity activity;
private String data[];
private LayoutInflater inflater=null;
public ImageLoader imageLoader;
DisplayImageOptions options;
public LazyAdapter(Activity a, String[] d) {
activity = a;
data=d;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
File cacheDir = StorageUtils.getOwnCacheDirectory(a, "MyFolderCache");
// Get singletone instance of ImageLoader
imageLoader = ImageLoader.getInstance();
// Create configuration for ImageLoader (all options are optional)
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(a)
// You can pass your own memory cache implementation
.discCacheExtraOptions(1024, 1024, CompressFormat.PNG, 100)
.discCache(new UnlimitedDiscCache(cacheDir)) // You can pass your own disc cache implementation
.discCacheFileNameGenerator(new HashCodeFileNameGenerator())
.enableLogging()
.build();
// Initialize ImageLoader with created configuration. Do it once.
imageLoader.init(config);
//imageLoader.init(ImageLoaderConfiguration.createDefault(a));
// imageLoader=new ImageLoader(activity.getApplicationContext());
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.ic_launcher)
.cacheInMemory()
.cacheOnDisc()
.displayer(new RoundedBitmapDisplayer(20))
.build();
}
public int getCount() {
return data.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
ViewHolder vh = new ViewHolder();;
if(convertView==null)
{
vi = inflater.inflate(R.layout.row, null);
vh.iv=(ImageView)vi.findViewById(R.id.ivv);
vh.pb= (ProgressBar)vi.findViewById(R.id.pb);
vh.tv = (TextView) vi.findViewById(R.id.textView1);
vh.tv1= (TextView) vi.findViewById(R.id.textView2);
}
vh.tv.setText("Image in postion =");
vh.tv1.setText(""+position);
display(vh.iv, data[position], vh.pb);
//imageLoader.displayImage(data.get(position).toString(), image,options);
return vi;
}
public void display(ImageView img, String url, final ProgressBar spinner)
{
imageLoader.displayImage(url, img, options, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
spinner.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
spinner.setVisibility(View.GONE);
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
spinner.setVisibility(View.GONE);
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
}
});
}
public static class ViewHolder
{
ImageView iv;
TextView tv,tv1;
ProgressBar pb;
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="@drawable/ic_launcher" />
<ProgressBar
android:id="@+id/pb"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/textView2"
android:layout_alignParentLeft="true"
android:layout_marginBottom="21dp"
android:layout_marginLeft="31dp"
android:text="TextView" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView1"
android:layout_alignParentBottom="true"
android:text="TextView" />
</RelativeLayout>
Add permission in manifest
<uses-permission android:name="android.permission.INTERNET"/>
I dont know about storing the images, as my app uses images from the APK. However I believe for displaying those images you want a custom Arrayadapter.
This inflates a layout for each item and places it in a list. This layout is defined by and XML layout you create and specify in its construction. You should try extending whatever adapter you currently use for your list view with a custom one that sets the image view according to the item.
I do this with ImageView.setImageResource(resource ID); But your mileage may vary. I have my images in the APK not sure how to display them from an external source
Do you want something easy to use? With take care of caching files, deleting the cache, release when the memory is at border line?
Try LazyList, check it out:
https://github.com/nicolasjafelle/LazyList
As it is explained, you only need to create the Singleton in your Application class or any other Activity or Fragment:
//To use the default external folder, this folder will be deleted when the app no longe exists.
ImageLoader.getInstance().init(getApplicationContext());
//Or to use another folder, use...
//ImageLoader.getInstance().init(getApplicationContext(), "MyExternalFolder");
Then in your view that has the ImageView to display de Image you need to implement ImageProcessingCallback interface:
public class MyItemView extends LinearLayout implements ImageProcessingCallback {
...
//Do what you need in methods onImagePreProcessing() and onImageProcessing(Bitmap bitmap)
...
ImageLoader.getInstance().displayImage(data[position], myView);
Finally you need to add this permission in your androidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
And that's it. Then you have methods to clear the cache for ram cache or disk cache or both.