Munkhbold Enkhtur
Munkhbold Enkhtur

Reputation: 618

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 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

Answers (2)

Sagar Pujari
Sagar Pujari

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

user4617571
user4617571

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

Related Questions