In my project I have a grid view which contains images. Based on my research, Universal Image Loader project is designed to download images in background. Then based of sample I set my adapter. This is the code that I have written:
package cam.astro.mania.adapters;
import java.io.File;
import java.util.ArrayList;
import com.astro.mania.activities.Contestants_Photo;
import com.astro.mania.activities.R;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;
import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache;
import com.nostra13.universalimageloader.core.DecodingType;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.ImageLoadingListener;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Environment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ProgressBar;
public class ContestantsPhotoAdapter extends BaseAdapter {
private Context context;
private LayoutInflater myInflater;
private Bitmap[] bitmapList;
private Bitmap bitmap;
private ArrayList<String> ListOfURLs;
private ImageLoader imageLoader;
private ProgressDialog progressBar;
private File cacheDir;
private ImageLoaderConfiguration config;
private DisplayImageOptions options;
public ContestantsPhotoAdapter(Context c) {
context = c;
myInflater = LayoutInflater.from(c);
// Get singleton instance of ImageLoader
imageLoader = ImageLoader.getInstance();
}
public void setImageURLs(ArrayList<String> list){
ListOfURLs = list;
for(String str: ListOfURLs)
Log.i("URL Address>>>>", str);
cacheDir = new File(Environment.getExternalStorageDirectory(), "UniversalImageLoader/Cache");
// Create configuration for ImageLoader
config = new ImageLoaderConfiguration.Builder(context)
.maxImageWidthForMemoryCache(800)
.maxImageHeightForMemoryCache(800)
.httpConnectTimeout(5000)
.httpReadTimeout(30000)
.threadPoolSize(5)
.threadPriority(Thread.MIN_PRIORITY + 2)
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new UsingFreqLimitedMemoryCache(2000000)) // You can pass your own memory cache implementation
.discCache(new UnlimitedDiscCache(cacheDir)) // You can pass your own disc cache implementation
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())
.build();
// Creates display image options for custom display task
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.icon_loading)
.showImageForEmptyUrl(R.drawable.icon_remove)
.cacheInMemory()
.cacheOnDisc()
.decodingType(DecodingType.MEMORY_SAVING)
.build();
// Initialize ImageLoader with created configuration. Do it once.
imageLoader.init(config);
}
@Override
public int getCount() {
return ListOfURLs.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent){
ViewHolder holder;
if (convertView == null) {
convertView = myInflater.inflate(R.layout.grid_contestantsphoto, null);
holder = new ViewHolder();
holder.ivIcon = (ImageView) convertView.findViewById(R.id.imvContestantsPhoto_icon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// holder.ivIcon.setImageBitmap(bitmapList[position]);
String imageUrl = ListOfURLs.get(position);
// Load and display image
imageLoader.displayImage(imageUrl, holder.ivIcon, options, new ImageLoadingListener() {
@Override
public void onLoadingStarted() {
showLoading();
}
@Override
public void onLoadingFailed() {
stopLoading();
}
@Override
public void onLoadingComplete() {
stopLoading();
}
});
return convertView;
}
static class ViewHolder {
ImageView ivIcon;
}
/*-----------------------------------------------------------------------------------
* Showing / Stopping progress dialog which is showing loading animation
* ---------------------------------------------------------------------------------*/
private void showLoading(){
progressBar = ProgressDialog.show(context, "", "");
progressBar.setContentView(R.layout.anim_loading);
progressBar.setCancelable(true);
final ImageView imageView = (ImageView) progressBar.findViewById(R.id.blankImageView);
Animation rotation = AnimationUtils.loadAnimation(context, R.anim.rotate);
imageView.startAnimation(rotation);
}
private void stopLoading() {
if(progressBar.isShowing())
progressBar.dismiss();
}
}
What I did? 1) I downloaded universal-image-loader-1.2.3.jar and put it into MY_PROJECT/lib folder then I added this jar file into java build path
2) Because for cashing images, this library needs to have access to local storage, therefore I added <uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"/>
to manifest file.
3) Now, when I run, the application crashes and points to imageLoader = ImageLoader.getInstance();
. Logcat message is:
dalvikvm: Could not find class 'cam.astro.mania.adapters.ContestantsPhotoAdapter$1', referenced from method cam.astro.mania.adapters.ContestantsPhotoAdapter.getView
AndroidRuntime: java.lang.NoClassDefFoundError: com.nostra13.universalimageloader.core.ImageLoader
AndroidRuntime: at cam.astro.mania.adapters.ContestantsPhotoAdapter.<init>(ContestantsPhotoAdapter.java:50)
Based on my research (for example here), I found that this message "comes when Java Virtual Machine is not able to find a particular class at runtime which was available during compile time."