0

I'm trying to use a lazylist to load my images and I'm using an array for my datas. But I cant figure out how to implement it into my view holder. Please check my codes below. this line of code

imageLoader.DisplayImage(worldpopulationlist.get(position).getFlag(), holder.flag);

The method DisplayImage(String, ImageView) in the type ImageLoader is not applicable for the arguments (int, ImageView)

ListViewAdapter

public class ListViewAdapter extends BaseAdapter {

    // Declare Variables
    Context mContext;
    LayoutInflater inflater;
    private List<WorldPopulation> worldpopulationlist = null;
    private ArrayList<WorldPopulation> arraylist;
    ImageLoader imageLoader;

    public ListViewAdapter(Context context, List<WorldPopulation> worldpopulationlist) {
        mContext = context;
        this.worldpopulationlist = worldpopulationlist;
        inflater = LayoutInflater.from(mContext);
        this.arraylist = new ArrayList<WorldPopulation>();
        this.arraylist.addAll(worldpopulationlist);
        imageLoader = new ImageLoader(mContext);
    }

    public class ViewHolder {
        TextView rank;
        TextView country;
        TextView population;
        ImageView flag;
    }

    @Override
    public int getCount() {
        return worldpopulationlist.size();
    }

    @Override
    public WorldPopulation getItem(int position) {
        return worldpopulationlist.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    public View getView(final int position, View view, ViewGroup parent) {
        final ViewHolder holder;
        if (view == null) {
            holder = new ViewHolder();
            view = inflater.inflate(R.layout.listview_item, null);

            holder.rank = (TextView) view.findViewById(R.id.rank);
            holder.country = (TextView) view.findViewById(R.id.country);
            holder.population = (TextView) view.findViewById(R.id.population);
            holder.flag = (ImageView) view.findViewById(R.id.flag);
            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }

        holder.rank.setText(worldpopulationlist.get(position).getRank());
        holder.country.setText(worldpopulationlist.get(position).getCountry());
        holder.population.setText(worldpopulationlist.get(position).getPopulation());
        //holder.flag.setImageResource(worldpopulationlist.get(position).getFlag());
        imageLoader.DisplayImage(worldpopulationlist.get(position).getFlag(), holder.flag);

Imageloader

public class ImageLoader {

    MemoryCache memoryCache = new MemoryCache();
    private Map<ImageView, String> imageViews = Collections
            .synchronizedMap(new WeakHashMap<ImageView, String>());
    ExecutorService executorService;
    // Handler to display images in UI thread
    Handler handler = new Handler();

    public ImageLoader(Context context) {
        executorService = Executors.newFixedThreadPool(5);
    }

    final int tempimage = R.drawable.temp_image;

    public void DisplayImage(String url, ImageView imageView) {
        imageViews.put(imageView, url);
        Bitmap bitmap = memoryCache.get(url);
        if (bitmap != null)
            imageView.setImageBitmap(bitmap);
        else {
            queuePhoto(url, imageView);
            imageView.setImageResource(tempimage);
        }
    }

    private void queuePhoto(String url, ImageView imageView) {
        PhotoToLoad p = new PhotoToLoad(url, imageView);
        executorService.submit(new PhotosLoader(p));
    }

    private Bitmap getBitmap(String url) {
        File f = new File(url);
        Bitmap b = decodeFile(f);
        if (b != null) {
            return b;
        }
        return null;
    }

    // Decodes image and scales it to reduce memory consumption
    private Bitmap decodeFile(File f) {
        try {
            // Decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            FileInputStream stream1 = new FileInputStream(f);
            BitmapFactory.decodeStream(stream1, null, o);
            stream1.close();

            // Find the correct scale value. It should be the power of 2.
            // Recommended Size 512
            final int REQUIRED_SIZE = 512;
            int width_tmp = o.outWidth, height_tmp = o.outHeight;
            int scale = 1;
            while (true) {
                if (width_tmp / 2 < REQUIRED_SIZE
                        || height_tmp / 2 < REQUIRED_SIZE)
                    break;
                width_tmp /= 2;
                height_tmp /= 2;
                scale *= 2;
            }

            // Decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            FileInputStream stream2 = new FileInputStream(f);
            Bitmap bitmap = BitmapFactory.decodeStream(stream2, null, o2);
            stream2.close();
            return bitmap;
        } catch (FileNotFoundException e) {
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    // Task for the queue
    private class PhotoToLoad {
        public String url;
        public ImageView imageView;

        public PhotoToLoad(String u, ImageView i) {
            url = u;
            imageView = i;
        }
    }

    class PhotosLoader implements Runnable {
        PhotoToLoad photoToLoad;

        PhotosLoader(PhotoToLoad photoToLoad) {
            this.photoToLoad = photoToLoad;
        }

        @Override
        public void run() {
            try {
                if (imageViewReused(photoToLoad))
                    return;
                Bitmap bmp = getBitmap(photoToLoad.url);
                memoryCache.put(photoToLoad.url, bmp);
                if (imageViewReused(photoToLoad))
                    return;
                BitmapDisplayer bd = new BitmapDisplayer(bmp, photoToLoad);
                handler.post(bd);
            } catch (Throwable th) {
                th.printStackTrace();
            }
        }
    }

    boolean imageViewReused(PhotoToLoad photoToLoad) {
        String tag = imageViews.get(photoToLoad.imageView);
        if (tag == null || !tag.equals(photoToLoad.url))
            return true;
        return false;
    }

    // Used to display bitmap in the UI thread
    class BitmapDisplayer implements Runnable {
        Bitmap bitmap;
        PhotoToLoad photoToLoad;

        public BitmapDisplayer(Bitmap b, PhotoToLoad p) {
            bitmap = b;
            photoToLoad = p;
        }

        public void run() {
            if (imageViewReused(photoToLoad))
                return;
            if (bitmap != null)
                photoToLoad.imageView.setImageBitmap(bitmap);
            else
                photoToLoad.imageView.setImageResource(tempimage);
        }
    }

    public void clearCache() {
        memoryCache.clear();
    }

}

Worldpopulation

public class WorldPopulation {
    private String rank;
    private String country;
    private String population;
    private int flag;

    public WorldPopulation(String rank, String country, String population,
            int flag) {
        this.rank = rank;
        this.country = country;
        this.population = population;
        this.flag = flag;
    }

    public String getRank() {
        return this.rank;
    }

    public String getCountry() {
        return this.country;
    }

    public String getPopulation() {
        return this.population;
    }

    public int getFlag() {
        return this.flag;
    }
}
nostra13
  • 12,377
  • 3
  • 33
  • 43
KC Chai
  • 1,607
  • 9
  • 30
  • 59

2 Answers2

0

as you are getting

The method DisplayImage(String, ImageView) in the type ImageLoader is not applicable for the arguments (int, ImageView)

means worldpopulationlist.get(position).getFlag() returning an integer value instead of an image url. so make sure you are using right getter/setter for image url.

ImageLoader.DisplayImage(String,ImageView) method takes two parameter first as String url for image and second is imageView instance to which you want to set downloaded image

ρяσѕρєя K
  • 132,198
  • 53
  • 198
  • 213
  • can I just change the string to Int in Imageloader? – KC Chai May 21 '13 at 18:44
  • @DroidBeginner : plz see [this](http://www.verious.com/qa/loading-image-from-drawable-or-asset-folder-triggers-java-lang-null-pointer-exception/) for loading image from Drawables using ImageLoader – ρяσѕρєя K May 21 '13 at 18:47
0
imageLoader.DisplayImage(imageurl, imageview);

The display method takes a String URL and a ImageView as the parameter.

In your case "The method DisplayImage(String, ImageView) in the type ImageLoader is not applicable for the arguments (int, ImageView)" indicating you have passed a int and a imageview.

Pass a string URL of the image as the first parameter and imageview as the second

What's LazyList?

For more information check the documentation @ https://github.com/nostra13/Android-Universal-Image-Loader

Community
  • 1
  • 1
Raghunandan
  • 132,755
  • 26
  • 225
  • 256
  • I dont have the URL of the image. The images are in my res folders. How do I get the URLs? – KC Chai May 21 '13 at 18:43
  • UIL is used for displaying images from server. You can also display images from a particular folder using the path. I am not aware of how to display images from res folder. – Raghunandan May 21 '13 at 18:48