在我的应用中,我从url
加载图片并使用imageview
在listview
中显示
但是当我滚动listview
image
更改时。
这是我的代码:
列表适配器:
class DataAdapter extends ArrayAdapter<ArtistClass>{
public DataAdapter() {
super(Activity.this,
android.R.layout.simple_list_item_1,datalist);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View item=convertView;
if(item==null){
LayoutInflater inflater=getLayoutInflater();
item=inflater.inflate(R.layout.listview, parent,false);
}
ArtistClass p=datalist.get(position);
TextView artistnametxt=(TextView)item.findViewById(R.id.artistnametxt);
ImageView artistimage=(ImageView)item.findViewById(R.id.artistimage);
String ospartistname=p.getartistname();
artistnametxt.setText(ospartistname);
String artistimageurl=p.getartistimage();
new DownloadImageTask(artistimage).execute(artistimageurl);
return (item);
}
}
及其从url加载图片的功能:
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;
public DownloadImageTask(ImageView bmImage) {
this.bmImage = bmImage;
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap mIcon11 = null;
try {
InputStream in = new java.net.URL(urldisplay).openStream();
mIcon11 = BitmapFactory.decodeStream(in);
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return mIcon11;
}
protected void onPostExecute(Bitmap result) {
bmImage.setImageBitmap(result);
}
}
}
答案 0 :(得分:0)
它becoz你异步加载图像。这意味着当图像加载完成时,listview适配器使用旧的imageView来保存和显示图像。
在设置位图之前,应始终将null或某些默认图像设置为imageiew。
protected void onPostExecute(Bitmap result) {
bmImage.setImageResource(null);
bmImage.setImageBitmap(result);
}
答案 1 :(得分:0)
首先,不要使用listview,而是使用新的RecyclerView。 使用recyclerview,您可以在数据中创建一个deDicaded ViewHolder。
其次,你需要在加载后缓存Bitmap,当项目不在屏幕上时,当视图再次出现在屏幕上时,视图和位图会被回收再利用,但是持有者会丢失位图引用并自动设置“随机“位图位于某些视图上。
要防止这种情况,请创建或使用缓存类LruCache。
参考文献: http://developer.android.com/reference/android/util/LruCache.html http://developer.android.com/intl/pt-br/training/displaying-bitmaps/process-bitmap.html