Android ListView回收问题
我有一个带有自定义适配器的listview,每行中都有一个imageview,我通过URL将图像下载到远程服务器,并将其传递给AsyncTask。我的代码正在工作,但当我滚动listview时,ImageView的下载图像会再次下载 我想下载第一次创建listview的图像。我研究了很多话题,但什么都不懂。我该怎么办 我的自定义适配器在下面Android ListView回收问题,android,listview,android-asynctask,imageview,Android,Listview,Android Asynctask,Imageview,我有一个带有自定义适配器的listview,每行中都有一个imageview,我通过URL将图像下载到远程服务器,并将其传递给AsyncTask。我的代码正在工作,但当我滚动listview时,ImageView的下载图像会再次下载 我想下载第一次创建listview的图像。我研究了很多话题,但什么都不懂。我该怎么办 我的自定义适配器在下面 public ListAdapter(Context context, ProgramInfo values) { this.contex
public ListAdapter(Context context, ProgramInfo values) {
this.context = context;
this.values = values;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount(){
return values.getSize();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = mInflater.inflate(R.layout.list_row, null);
TextView programName = (TextView)rowView.findViewById(R.id.programName);
TextView programTime = (TextView)rowView.findViewById(R.id.programTime);
TextView programState = (TextView)rowView.findViewById(R.id.programState);
ImageView programImage = (ImageView)rowView.findViewById(R.id.programImage);
programName.setText(values.programNames.get(position));
programTime.setText(values.programTimes.get(position));
new DownloadImage(programImage).execute(values.programImageUrls.get(position)); // download images
return rowView;
}
而我的任务
private class DownloadImage extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;
public DownloadImage(ImageView bmImage) {
this.bmImage = bmImage;
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap mIcon11 = null;
try {
HttpURLConnection urlConnection = (HttpURLConnection)new URL(urldisplay).openConnection();
urlConnection.setDoInput(true);
InputStream in = urlConnection.getInputStream();
mIcon11 = BitmapFactory.decodeStream(in);
urlConnection.disconnect();
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return mIcon11;
}
protected void onPostExecute(Bitmap result) {
bmImage.setImageBitmap(result);
}
}
私有类下载映像扩展异步任务{
图像视图bmImage;
公共下载图像(ImageView bmImage){
this.bmImage=bmImage;
}
受保护位图doInBackground(字符串…URL){
字符串urldisplay=url[0];
位图mIcon11=null;
试一试{
HttpURLConnection urlConnection=(HttpURLConnection)新URL(urldisplay).openConnection();
urlConnection.setDoInput(true);
InputStream in=urlConnection.getInputStream();
mIcon11=BitmapFactory.decodeStream(in);
urlConnection.disconnect();
}捕获(例外e){
Log.e(“Error”,e.getMessage());
e、 printStackTrace();
}
返回mIcon11;
}
受保护的void onPostExecute(位图结果){
bmImage.setImageBitmap(结果);
}
}
谢谢…在adapters中,每出现一行,就会执行side getView中的每一项操作 所以必须在GetViewHolder中使用ViewHolder来保存每行元素的状态 在重新下载之前,我们使用if语句检查ImageView是否为null。。。。 这是我所说的令人惊讶的例子
在ListView中为imageview使用通用图像加载器库查看视图支架模式,以优化回收。您还可以使用位图缓存。。。