我在向以下代码实现异步图像加载器时遇到问题。我在网上看了一些关于它的帖子,我想我理解它背后的逻辑,但我似乎没有实现它。
下面的代码是我用来简单地加载listview中的图像。
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;
}
}
答案 0 :(得分:8)
您可以将我的示例代码用作参考Lazy load of images in ListView
答案 1 :(得分:1)
你看过SmartImageView吗? http://loopj.com/android-smart-image-view/
异步加载图像是非常简单的库(:
此库的一些功能
DropView替代ImageView 从URL加载图像 从手机的联系地址簿中加载图像 异步加载图像,加载发生在UI线程之外 图像被缓存到内存和磁盘以进行超快速加载 SmartImage类可以轻松扩展到从其他来源加载
答案 2 :(得分:0)
On解决方案是在你的适配器中填充一个类变量,比如一个带有引用所有“ImageView listDescription”的ArrayList
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);
}
}
然后使用遍历每个ImageView的AsyncTask,检索关联的Image并从ArrayList中删除ImageView。它将在后台一次下载一个,而你的gui仍会响应。