3

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 enter image description here

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."

6
  • which version of ADT are you using now ? Commented Apr 21, 2012 at 9:19
  • Thanks Samir, I'm not sure, how can i get it? Commented Apr 21, 2012 at 9:22
  • See here Commented Apr 21, 2012 at 9:31
  • Thanks for useful info. My ADT Version is 18. I have above problem when I add jar into Java build path and its folder name is "lib". in this case i can run the application with mentioned crash issue. Commented Apr 21, 2012 at 10:11
  • 1
    When i remove jar file from Java class path and change the name of folder from "lib" to "libs", then jar file automatically adds to Android Dependencies. Now, everything is fine :) Thank you so much for your help Commented Apr 21, 2012 at 10:12

2 Answers 2

4

When i remove jar file from Java class path and change the name of folder from "lib" to "libs", then jar file automatically adds to Android Dependencies. Now, everything is fine

Sign up to request clarification or add additional context in comments.

Comments

1

Make sure to check the jar under the "Order and Export" tab after you add the external jar.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.