当滚动我的列表视图项目图像改变
when scrolling my list view item images changed
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 任务class 成功后我更改图像
protected void onPostExecute(String file_url) {
if (imageViewReference != null) {
ImageView imageView = imageViewReference.get();
imageView.setImageBitmap(bitmap);
}
}
}
尽量不要将imageview放在viewholder里面。像这样
ImageView itemImage = (ImageView) convertView.findViewById(R.id.img_t);
itemImage.setImageBitmap(img.bitmap);
如果还不能解决问题,请使用 picasso 或 glide 来下载、缓存和显示图像。
ViewHolder 模式用于回收创建的视图(用于优化和防止膨胀大量视图),当您滚动列表视图时,实际上您需要下载多个不同的图像 url 并显示它们在同一个 ImageView 中(因为 holder.itemImage refrence 没有改变)。
所以只要你的 AsyntTask 完成它的工作,你的图像视图就会改变。
解决方案: 你可以为每一行放大你的视图,不要使用 ViewHolder 模式(不推荐),或者签署你的图像视图(使用 holder.itemImage。 setTag("yourUrl")) 和 url 并在将图像设置到 ImageView 之前在 AsyntTask 中检查它,只有标记的 url 等于 AsyntTask 下载的图像 url 改变了 ImageView .
但是为了便于使用和针对不同情况进行许多优化,我建议使用 Picasso 库在您的适配器中加载图像。
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 任务class 成功后我更改图像
protected void onPostExecute(String file_url) {
if (imageViewReference != null) {
ImageView imageView = imageViewReference.get();
imageView.setImageBitmap(bitmap);
}
}
}
尽量不要将imageview放在viewholder里面。像这样
ImageView itemImage = (ImageView) convertView.findViewById(R.id.img_t);
itemImage.setImageBitmap(img.bitmap);
如果还不能解决问题,请使用 picasso 或 glide 来下载、缓存和显示图像。
ViewHolder 模式用于回收创建的视图(用于优化和防止膨胀大量视图),当您滚动列表视图时,实际上您需要下载多个不同的图像 url 并显示它们在同一个 ImageView 中(因为 holder.itemImage refrence 没有改变)。 所以只要你的 AsyntTask 完成它的工作,你的图像视图就会改变。
解决方案: 你可以为每一行放大你的视图,不要使用 ViewHolder 模式(不推荐),或者签署你的图像视图(使用 holder.itemImage。 setTag("yourUrl")) 和 url 并在将图像设置到 ImageView 之前在 AsyntTask 中检查它,只有标记的 url 等于 AsyntTask 下载的图像 url 改变了 ImageView .
但是为了便于使用和针对不同情况进行许多优化,我建议使用 Picasso 库在您的适配器中加载图像。