我的任务是使用Rest
调用下载图片网址,并使用ListView
将其呈现为Android adapter
。要进行Rest
调用我正在使用retrofit
,它返回Json
(Json有图像的网址)。
我正在使用picasso
从服务器下载图像并将其呈现为Listview
。一切正常,因为我现在只有几个图像可供下载。
如果要下载超过500张图像,我该如何完成任务?什么是最好的方法。
@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
下载它们的正确方法吗?或者有更好的解决方案吗?
我想我误解了你们。我的问题是当我有1000个图像URL时如何实现上述场景。
答案 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.
但请注意:
下面的代码是一个快速而基本的例子。请不要介意语法。我只是想指出最重要的部分。
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;
}
}
希望这有帮助。