2013-05-21 75 views
0

我想使用lazylist来加载我的图像,我使用数组作为我的数据。但我不知道如何将其实施到我的查看者。请在下面检查我的代码。这行代码Android ListView ArrayAdapter

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

在类型ImageLoader的方法DisplayImage(字符串,ImageView的)是不适用的参数(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(); 
    } 

} 

世界人口

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

回答

0

如你正在

在类型ImageLoader的方法DisplayImage(字符串,ImageView的)是 不适用于参数(INT,ImageView的)

装置worldpopulationlist.get(position).getFlag()返回一个整数值而不是图片url。所以请确保你正在使用正确的getter/setter图像url。

ImageLoader.DisplayImage(String,ImageView)方法首先需要两个参数作为字符串URL用于图像和第二个是ImageView的实例要设置下载的图像

+0

我可以改变ImageLoader的对INT字符串? –

+0

@DroidBeginner:PLZ参见[此](http://www.verious.com/qa/loading-image-from-drawable-or-asset-folder-triggers-java-lang-null-pointer-exception/),用于使用ImageLoader从Drawables加载图像 –

0
imageLoader.DisplayImage(imageurl, imageview); 

的显示方法需要一个字符串URL和ImageView的作为参数。

你的情况“ImageLoader类型中的方法DisplayImage(String,ImageView)不适用于参数(int,ImageView)”,表示你已经传递了一个int和一个imageview。

传递图像的字符串URL作为第一个参数和ImageView的作为第二

What's LazyList?

欲了解更多信息,请查阅文档@https://github.com/nostra13/Android-Universal-Image-Loader

+0

我没有图像的URL。图像在我的res文件夹中。我如何获取网址? –

+0

UIL用于显示来自服务器的图像。您还可以使用路径显示来自特定文件夹的图像。我不知道如何显示res文件夹中的图像。 – Raghunandan

相关问题