如何下载图像(数千幅图像)并在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;
}
}