简体   繁体   English

Android ListView ArrayAdapter

[英]Android ListView ArrayAdapter

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) 类型为ImageLoader的方法DisplayImage(String,ImageView)不适用于参数(int,ImageView)

ListViewAdapter 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;
    }
}

as you are getting 随着你越来越

The method DisplayImage(String, ImageView) in the type ImageLoader is not applicable for the arguments (int, ImageView) 类型为ImageLoader的方法DisplayImage(String,ImageView)不适用于参数(int,ImageView)

means worldpopulationlist.get(position).getFlag() returning an integer value instead of an image url. 表示worldpopulationlist.get(position).getFlag()返回一个整数值而不是图像url。 so make sure you are using right getter/setter for image url. 因此,请确保您使用正确的getter / setter作为图片网址。

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 ImageLoader.DisplayImage(String,ImageView)方法采用两个参数,第一个是图像的String url,第二个是要设置下载图像的imageView实例。

imageLoader.DisplayImage(imageurl, imageview);

The display method takes a String URL and a ImageView as the parameter. display方法使用String URL和ImageView作为参数。

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. 在您的情况下,“ ImageLoader类型的DisplayImage(String,ImageView)方法不适用于参数(int,ImageView)”,表明您已传递int和imageview。

Pass a string URL of the image as the first parameter and imageview as the second 传递图像的字符串URL作为第一个参数,并传递imageview作为第二个参数

What's LazyList? 什么是LazyList?

For more information check the documentation @ https://github.com/nostra13/Android-Universal-Image-Loader 有关更多信息,请查看文档@ https://github.com/nostra13/Android-Universal-Image-Loader

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM