-4

When the image has been downloaded, some of the images duplicates in the listview rows, even though some of the row has no ImageID, The adapter view duplicates the downloaded images, when i suddenly scroll the listview

My code in getView

public View getView(final int position, View convertView, ViewGroup parent) {
    int anotherPosition = position;


    if (inflater == null) {
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    final Holder holder;
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.list_item, null);
        holder = new Holder();

        holder.title = (TextView) convertView.findViewById(R.id.description);
        holder.exp = (TextView) convertView.findViewById(R.id.expiration);
        holder.someImages = (ImageView) convertView.findViewById(R.id.listview_image);
        holder.isFavouriteImage = (ImageView) convertView.findViewById(R.id.isFavourite);

        convertView.setTag(holder);
        convertView.setTag(R.id.listview_image, holder.someImages);
        convertView.setTag(R.id.description, holder.title);
        convertView.setTag(R.id.expiration, holder.exp);
        convertView.setTag(R.id.isFavourite, holder.isFavouriteImage);
    } else {
        holder = (Holder) convertView.getTag();
    }
    RowItemLoyalty rowItemLoyalty = data.get(position);

    if(rowItemLoyalty != null) {
        holder.someImages.setTag(position);
        holder.someImages.setImageBitmap(null);
        holder.title.setText(data.get(position).getDescription());
        holder.exp.setText(data.get(position).getDateEnd());

        Log.d("TrueOrFalse", String.valueOf(holder.someImages));
        if(holder.someImages != null ) {
            if (data.get(position).getImageId() != 0) {
                data.get(position).setBitmap(email, password, data.get(position).getImageId(), data.get(position).getBitmap(), new RowItemLoyalty.RetrieveBitmapListener() {
                    @Override
                    public void onSuccess(Bitmap bitmap) {
                        Log.d("ImageID123", String.valueOf(data.get(position).getImageId()));
                        holder.someImages.setImageBitmap(null);
                        if (data.get(position).getBitmap() != null) {
                            Log.d("True", "True");
                            holder.someImages.setImageBitmap(bitmap);
                        }
                    }
                });
            }
        } else if(holder.someImages == null ) {
            Drawable placeholder = ContextCompat.getDrawable(context, R.drawable.placeholderwhite);
            holder.someImages.setImageDrawable(placeholder);
            Log.d("PlaceHolder2", String.valueOf(placeholder));
        }

        //----------- placeholder for imageview list -----------

        //holder.someImages.setImageBitmap(null);
        if (data.get(position).getBitmap() != null && holder.someImages != null) {
            holder.someImages.setImageBitmap(data.get(position).getBitmap());
            Log.d("PlaceHolder", "Implemented");
            Log.d("PlaceHolder", String.valueOf(data.get(position)));
        } else if (data.get(position).getBitmap() == null) {
            Drawable placeholder = ContextCompat.getDrawable(context, R.drawable.placeholderwhite);
            holder.someImages.setImageDrawable(placeholder);
            Log.d("PlaceHolder2", String.valueOf(placeholder));
        }

        //------------ for favourite logo-------------
        if (data.get(position).getIsFavorite() == false) {
            Drawable placeholderIsNotFavourite = ContextCompat.getDrawable(context, R.drawable.ic_favourite_icon);
            holder.isFavouriteImage.setImageDrawable(placeholderIsNotFavourite);
        } else if (data.get(position).getIsFavorite() == true) {
            Drawable favourited = ContextCompat.getDrawable(context, R.drawable.favourite_two);
            holder.isFavouriteImage.setImageDrawable(favourited);
        }
    }

    return convertView;
}

My Holder class

public static class Holder {
    TextView title;
    TextView exp;
    TextView tokensFor;
    ImageView promotionImages;
    ImageView isFavouriteImage;
}
  • Show code of `Holder` class – Maveňツ Sep 28 '16 at 10:46
  • Maybe you should implement onFailure method on RowItemLoyalty.RetrieveBitmapListener – cgr Sep 28 '16 at 10:56
  • @maveň see the edited one – eryll salamanes Sep 29 '16 at 02:25
  • @eryllsalamanes use loader library ... or chceck(in the library code) how they are checking if view was reused ... the error is obvious: you are starting to load image1 to viewholder1 then viewholder1 is reused so you starting to load image2 to viewholder1 ... fx image1 is big ... so first loading of image2 is finished ... then image1 is finished and images are f** up ... **in onSuccess you need to check if Bitmap that you get is still valid for this viewholder** – Selvin Sep 29 '16 at 13:35
  • for example put imageid to holder and then compare it with `data.get(position).getImageId()` ... if they are different do not set it to ImageView ... asked bazillion times – Selvin Sep 29 '16 at 13:40

3 Answers3

1

There are some useful libraries you can use to loading images like Glide

Also you can see this Picasso v/s Imageloader v/s Fresco vs Glide

Community
  • 1
  • 1
FarshidABZ
  • 3,860
  • 4
  • 32
  • 63
0

Try using Universal Image Loader Universal Image Loader

to set image on ImageView

Rajesh Panchal
  • 1,140
  • 3
  • 20
  • 39
-1

Remove checking convertView == null condition, like this:

convertView = inflater.inflate(R.layout.list_item, null);
holder = new Holder();

holder.title = (TextView) convertView.findViewById(R.id.description);
holder.exp = (TextView) convertView.findViewById(R.id.expiration);
holder.someImages = (ImageView) convertView.findViewById(R.id.listview_image);
holder.isFavouriteImage = (ImageView) convertView.findViewById(R.id.isFavourite);       
Daniel Puiu
  • 962
  • 6
  • 21
  • 29
Sanjay Kakadiya
  • 1,596
  • 1
  • 15
  • 32