如何下载图像(数千个图像)并在Android中的ListAdapter中呈现它们?

时间:2015-09-16 18:16:14

标签: android android-listview retrofit picasso

我的任务是使用Rest调用下载图片网址,并使用ListView将其呈现为Android adapter。要进行Rest调用我正在使用retrofit,它返回Json(Json有图像的网址)。

我正在使用picasso从服务器下载图像并将其呈现为Listview。一切正常,因为我现在只有几个图像可供下载。

如果要下载超过500张图像,我该如何完成任务?什么是最好的方法。

MyAdapter类

@Override
public View getView(int position, View convertView, ViewGroup parent) {

 ImageView imageView = (ImageView) convertView.findViewById(R.id.imageView);

 Picasso
      .with(context)
      .load("http://i.imgur.com/rFLNqWI.jpg")
      .transform(imageTransformation)
      .into(imageView);
 return convertView;
}

上面的代码非常简单,即基于计数渲染一个图像。任何帮助都会很明显。

这是在count(imagesURL)的基础上运行循环并在上面的代码中使用picasso下载它们的正确方法吗?或者有更好的解决方案吗?

修改-2

我想我误解了你们。我的问题是当我有1000个图像URL时如何实现上述场景。

2 个答案:

答案 0 :(得分:1)

将Picasso用于getView方法是可以的。但您必须使用Holder Pattern来保存ImageView的实例。

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolderItem viewHolder;


    if(convertView==null || !(convertView.getTag() instanceof ViewHolderItem )){

        // inflate the layout
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        convertView = inflater.inflate(layoutResourceId, parent, false);

        // well set up the ViewHolder
        viewHolder = new ViewHolderItem();
        viewHolder.imageViewItem = (ImageView) convertView.findViewById(R.id.imageView);

        // store the holder with the view.
        convertView.setTag(viewHolder);

    }else{
        // we've just avoided calling findViewById() on resource everytime
        // just use the viewHolder
        viewHolder = (ViewHolderItem) convertView.getTag();
    }




  Picasso
      .with(context)
      .load("http://i.imgur.com/rFLNqWI.jpg")
      .transform(imageTransformation)
      .into(viewHolder.imageViewItem);




    return convertView;

}

static class ViewHolderItem {
    ImageView imageViewItem;
}

答案 1 :(得分:0)

不完全确定你在Picasso已经处理缓存的问题,它实际上意味着在列表视图中加载大量图像。我将尽力回答。

如果您已经加载了一张图片,那么您可以使用相同的概念加载500.

但请注意:

  1. 在适配器的#getView()函数中,如果您不希望列表视图挂起,请记得回收并遵循ViewHolder模式
  2. 您也可以使用RecyclerView而不是ListView,因为适配器会强制您实施ViewHolders。
  3. 下面的代码是一个快速而基本的例子。请不要介意语法。我只是想指出最重要的部分。

    public class SampleActivity extends Activity {
       MyAdapter mMyAdapter;
       public void onCreate(...) {
          super.onCreate(...);
          setContentView(...);
          List<String> listOfImages = new ArrayList<String>();
          // code here for adding/retrieving the image urls
          mMyAdapter = new MyAdapter(listOfImages);
          ListView listView = findViewById(...);
          listView.setAdapter(mMyAdapter);
       }    
    }
    
    public class MyAdapter extends BaseAdapter {
       List<String> mListOfImages;
       public MyAdapter(List<String> images) {
           mListOfImages = images;
       }
       public int getCount() {
           return mListOfImages.size();
       }
    
       ...
       ...
    
       public View getView(int position, View convertView, ViewGroup parent) {
    
          ViewHolder holder = convertView.getTag();
          if (holder == null) {
             holder = new ViewHolder();
             convertView.setTag(holder);
          }
          if (holder.mImageView == null) {
             ImageView imageView = (ImageView) convertView.findViewById(R.id.imageView);
             holder.mImageView = imageView;
          }
    
          Picasso
             .with(convertView.getContext())
             .load(mListOfImages.get(position))
             .transform(imageTransformation)
             .into(holder.mImageView);
           return convertView;
       }
    
       public static class ViewHolder {
          public ImageView mImageView;
       }
    }
    

    希望这有帮助。