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

如何下载图像(数千幅图像)并在android的ListAdapter中呈现它们?,android,android-listview,retrofit,picasso,Android,Android Listview,Retrofit,Picasso,我的任务是使用Restcall下载图像URL,并使用Android适配器将它们呈现到ListView。为了进行Rest调用,我正在使用revolution,它返回一个Json(Json有图像的URL) 我正在使用毕加索从服务器下载图像,并将其渲染到列表视图。一切正常,因为我现在只有几张图片要下载 当我要下载500多张图片时,我如何才能完成这项任务。最好的方法是什么 MyAdapter类 以上代码非常简单,即基于计数渲染一幅图像。任何帮助都是值得的 这是基于count(imagesURL)运行循环

我的任务是使用
Rest
call下载图像URL,并使用
Android适配器将它们呈现到
ListView
。为了进行
Rest
调用,我正在使用
revolution
,它返回一个
Json
(Json有图像的URL)

我正在使用
毕加索
从服务器下载图像,并将其渲染到
列表视图
。一切正常,因为我现在只有几张图片要下载

当我要下载500多张图片时,我如何才能完成这项任务。最好的方法是什么

MyAdapter类 以上代码非常简单,即基于计数渲染一幅图像。任何帮助都是值得的

这是基于
count(imagesURL)
运行循环并使用上面代码中的
picasso
下载循环的正确方法吗?还是有更好的解决办法

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

使用毕加索的
getView
方法是可以的。但必须使用Holder模式保存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;
}

不完全确定你在问什么,因为毕加索已经在处理缓存了,它实际上是用来在列表视图中加载大量图像的。我会尽力回答

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

然而,有几件事需要注意:

  • 在适配器的#getView()函数中,如果不希望listview挂起,请记住循环并遵循ViewHolder模式
  • 您还可以使用RecyclerView而不是ListView,因为适配器将强制您实现ViewHolder
  • 下面的代码是一个快速而基本的示例。请不要介意语法。我只想指出最重要的部分

    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;
       }
    }
    
    public类SampleActivity扩展活动{
    MyAdapter mMyAdapter;
    创建时的公共无效(…){
    super.onCreate(…);
    setContentView(…);
    List listOfImages=new ArrayList();
    //此处的代码用于添加/检索图像URL
    mMyAdapter=新的MyAdapter(列表图像);
    ListView ListView=findViewById(…);
    setAdapter(mMyAdapter);
    }    
    }
    公共类MyAdapter扩展了BaseAdapter{
    列出所有图片;
    公共MyAdapter(列出图像){
    mListOfImages=图像;
    }
    public int getCount(){
    返回mListOfImages.size();
    }
    ...
    ...
    公共视图getView(int位置、视图转换视图、视图组父视图){
    ViewHolder=convertView.getTag();
    if(holder==null){
    holder=新的ViewHolder();
    convertView.setTag(支架);
    }
    if(holder.mImageView==null){
    ImageView ImageView=(ImageView)convertView.findViewById(R.id.ImageView);
    holder.mImageView=imageView;
    }
    毕加索
    .with(convertView.getContext())
    .load(mListOfImages.get(位置))
    .transform(图像转换)
    .插入(保持架.mImageView);
    返回视图;
    }
    公共静态类视图持有者{
    公共图像视图mImageView;
    }
    }
    

    希望这能有所帮助。

    毕加索很棒,只要设置LRU足够大,可以容纳所有照片。但是如何实现上述场景呢。因此,该应用程序将不会被挂起。请查看此链接,它描述了如何加载图像Async@user24139...This这不是我的问题。我已经实施了它。我要问的是,当我有1000多个图像时,如何处理上述场景的最佳方法我已经实现了它。我想我误解你了。如果你有1000个URL的数组呢。您将如何实现上述代码?如果实现了ViewHolder模式,就不会有问题。毕加索有一个现成的缓存系统,现在考虑的是更好的性能,也许你应该迁移到
    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;
       }
    }