3

在我的项目中,我有一个包含图像的网格视图。根据我的研究,Universal Image Loader项目旨在在后台下载图像。然后根据示例我设置我的适配器。这是我写的代码:

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();
    }

}

我做了什么?1)我下载了universal-image-loader-1.2.3.jar并将其放入MY_PROJECT/lib文件夹然后我将此jar文件添加到java构建路径中 在此处输入图像描述

2)因为要兑现图像,这个库需要访问本地存储,所以我添加<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"/>到清单文件中。

3)现在,当我运行时,应用程序崩溃并指向imageLoader = ImageLoader.getInstance();. Logcat 消息是:

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)

根据我的研究(例如此处),我发现此消息“当 Java 虚拟机无法在运行时找到在编译期间可用的特定类时出现。

4

2 回答 2

4

当我从 Java 类路径中删除 jar 文件并将文件夹名称从“lib”更改为“libs”时,jar 文件会自动添加到 Android 依赖项。现在,一切都很好

于 2012-06-19T19:26:24.597 回答
1

添加外部 jar 后,请务必检查“订购和导出”选项卡下的 jar。

于 2013-02-08T08:38:56.143 回答