Reputation: 618
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 task class after success i change the image
protected void onPostExecute(String file_url) {
if (imageViewReference != null) {
ImageView imageView = imageViewReference.get();
imageView.setImageBitmap(bitmap);
}
}
}
Upvotes: 0
Views: 660
Reputation: 343
Try not to put imageview inside viewholder. Like this
ImageView itemImage = (ImageView) convertView.findViewById(R.id.img_t);
itemImage.setImageBitmap(img.bitmap);
If that doesn't solve the problem, use picasso or glide for downloading, caching and displaying images.
Upvotes: 1
Reputation:
ViewHolder pattern use for recycle created view (for optimization and prevent to inflate a lot of View), when you scroll your list view,in fact you have request to download several diffrent image url and show their in a same ImageView (cause holder.itemImage refrence not changed). so anytime that your AsyntTask complete its work, your image view changed.
Solution : you can inflate your view for each row and don't use ViewHolder pattern (not recommonded), or signed your image view(use holder.itemImage.setTag("yourUrl")) with url and check it in your AsyntTask before set image to your ImageView,only if tagged url is equal to image url that AsyntTask downloaded changed ImageView.
But for easy using and many optimization for different situation, i recommended using Picasso library for loading image in your adapter.
Upvotes: 1