public class Adapter extends BaseAdapter {
private static ArrayList<ItemDetails> aList;
private LayoutInflater l_Inflater;
public Adapter(Context context, ArrayList<ItemDetails> results) {
aList = results;
l_Inflater = LayoutInflater.from(context);
}
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = l_Inflater.inflate(R.layout.mylist1, null);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.name);
holder.title = (TextView) convertView.findViewById(R.id.txt1);
holder.ago = (TextView) convertView.findViewById(R.id.date);
holder.member = (TextView) convertView.findViewById(R.id.member);
holder.itemImage = (ImageView) convertView.findViewById(R.id.img_t);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.name.setText(aList.get(position).getName());
holder.title.setText(aList.get(position).getTitle());
holder.ago.setText(aList.get(position).getAgo());
holder.member.setText(aList.get(position).getMember());
String url = aList.get(position).getImg();
Log.d("image_name", url);
if (url.length() > 9) {
Log.d("image_url", url);
DownloadFileFromURL img = new DownloadFileFromURL(holder.itemImage, position);
img.execute(url);
if(img.pos == position) {
holder.itemImage.setImageBitmap(img.bitmap);
}
aList.get(position).setChanged();
}
notifyDataSetChanged();
return convertView;
}
public static class ViewHolder {
TextView name;
TextView title;
TextView ago;
TextView member;
ImageView itemImage;
}
}
asynck任务类成功后我改变了图像
protected void onPostExecute(String file_url) {
if (imageViewReference != null) {
ImageView imageView = imageViewReference.get();
imageView.setImageBitmap(bitmap);
}
}
}
答案 0 :(得分:1)
尽量不要将viewview放在viewholder中。喜欢这个
ImageView itemImage = (ImageView) convertView.findViewById(R.id.img_t);
itemImage.setImageBitmap(img.bitmap);
如果这不能解决问题,请使用毕加索或滑动下载,缓存和显示图像。
答案 1 :(得分:1)
ViewHolder模式用于循环创建的视图(用于优化并防止充斥大量View),当您滚动列表视图时,实际上您有请求下载几个不同的图像URL并在同一ImageView中显示它们(原因) holder.itemImage refrence未更改)。 因此,只要您的AsyntTask完成其工作,您的图像视图就会发生变化。
解决方案:您可以为每一行的视图充气,不要使用ViewHolder模式(不推荐),或者签署您的图片视图(使用holder.itemImage.setTag(&#34) ; yourUrl&#34;))使用url并在将图像设置为ImageView之前在AsyntTask中检查它,只有当标记的url等于AsyntTask下载的图像URL更改了ImageView时。
但为了便于使用和针对不同情况进行多次优化,我建议使用Picasso库在适配器中加载图像。