5

我在为以下代码实现异步图像加载器时遇到问题。我在网上阅读了一些关于它的帖子,我想我理解它背后的逻辑,但我似乎未能实现它。

下面的代码是我用来简单地在我的列表视图中加载图像的代码。

public class MyCustomAdapter extends ArrayAdapter<RSSItem> {
   Bitmap bm;

   public MyCustomAdapter(Context context, int textViewResourceId, List<RSSItem> list) {
      super(context, textViewResourceId, list); 
   }

   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
      // TODO Auto-generated method stub
      BitmapFactory.Options bmOptions;
      bmOptions = new BitmapFactory.Options();
      bmOptions.inSampleSize = 1;
      bm = LoadImage(myRssFeed.getList().get(position).getDescription(), bmOptions);

      View row = convertView;

      if(row == null) {
         LayoutInflater inflater = getLayoutInflater();
         row = inflater.inflate(R.layout.rsslist, parent, false); 
      }

      TextView listTitle = (TextView)row.findViewById(R.id.listtitle);
      listTitle.setText(myRssFeed.getList().get(position).getTitle());
      ImageView listDescription = (ImageView)row.findViewById(R.id.listdescription);
      listDescription.setImageBitmap(bm);
      TextView listPubdate = (TextView)row.findViewById(R.id.listpubdate);
      listPubdate.setText(myRssFeed.getList().get(position).getPubdate());

      return row;
   }
}
4

3 回答 3

8

您可以使用我的示例代码作为参考ListView 中的图像延迟加载

于 2010-07-05T11:56:06.053 回答
1

你看过 SmartImageView 吗? http://loopj.com/android-smart-image-view/

这是异步加载图像的非常简单的库(:

这个库的一些特点

ImageView 的插入式替代 从 URL 加载图像 从手机的联系人地址簿加载图像 图像的异步加载,加载发生在 UI 线程之外 图像缓存到内存和磁盘以实现超快速加载 SmartImage 类很容易扩展以从其他来源

于 2013-07-27T11:43:13.857 回答
0

解决方案是在您的适配器中填充一个类变量,例如一个 ArrayList,其中引用所有“ImageView listDescription”

ArrayList<ImageView> allImageViews = new ArrayList<ImageView>();    
    ...

    public View getView(int position, View convertView, ViewGroup parent){
       ...
       ImageView listDescription=(ImageView)row.findViewById(R.id.listdescription);
       allImageViews.add(listDescription);
       ...
    }

    private class ImageDownLoader extends AsyncTask<ArrayList, Void, Void>{
       doInBackground(){
         for(ImageView imageView: allImageViews){
         BitmapFactory.Options bmOptions;
         bmOptions = new BitmapFactory.Options();
         bmOptions.inSampleSize = 1;
         bm = LoadImage(imageNameOrWhatever, bmOptions);
         imageView.setImageBitmap(bm);
       } 
    }

然后使用 AsyncTask 遍历每个 ImageView,检索关联的 Image 并从 ArrayList 中删除 ImageView。它会在后台一次下载一个,而您的 gui 仍然会响应。

于 2010-07-05T11:17:03.293 回答