stud91
stud91

Reputation: 1854

Repeatable images in listview - Android

I have a ListView that contains images and text downloaded from server.

The text appears fine and doesn't repeat but the images do. I have template layout to display images which i inflate according to the number of images received. However after my 3rd list entry (row) the images start to repeat themselves.

Here is my getView() method in my ArrayAdapter

@Override
    public View getView(int position, View convertView, ViewGroup parent) {

    if (convertView == null) {
        inflater = ((Activity) context).getLayoutInflater();
        convertView = inflater.inflate(resourceId, parent, false);
    }

    TextView feedHeading = (TextView) convertView.findViewById(R.id.tv_feedheading);
    TextView feedSubheading = (TextView) convertView.findViewById(R.id.tv_feedsubheading);

    LinearLayout imagesLayout = (LinearLayout) convertView.findViewById(R.id.ll_images);

    View view;
    Feeds feed = mfeeds.get(position);

    ImageLoader.getInstance().clearDiskCache();
    ImageLoader.getInstance().clearMemoryCache();

    feedHeading.setText(feed.title);
    feedSubheading.setText(feed.subtitle);

    ImageView image1;
    ImageView image2 = null;
    ImageView image3 = null;
    ImageView image4 = null;
    ImageView image5 = null;
    List<ImageView> imageViewList = new ArrayList<>();

    if (feed.imageIds.length == 0){
        view = inflater.inflate(R.layout.template_oneimage2, imagesLayout, false);
        imageViewList.clear();
        image1 = (ImageView) view.findViewById(R.id.iv_t_1);
        imageViewList.add(image1);

    }
    else if (feed.imageIds.length == 1){
        view = inflater.inflate(R.layout.template_oneimage2, imagesLayout, false);
        imageViewList.clear();
        image1 = (ImageView) view.findViewById(R.id.iv_t_1);
        imageViewList.add(image1);
    }
    else if (feed.imageIds.length == 2){
        view = inflater.inflate(R.layout.template_twoimage, imagesLayout, false);
        imageViewList.clear();
        image1 = (ImageView) view.findViewById(R.id.iv_t_1);
        image2 = (ImageView) view.findViewById(R.id.iv_t_2);
        imageViewList.add(image1);
        imageViewList.add(image2);
    }
    else if (feed.imageIds.length == 3){
        view = inflater.inflate(R.layout.template_threeimage1, imagesLayout, false);
        imageViewList.clear();
        image1 = (ImageView) view.findViewById(R.id.iv_t_1);
        image2 = (ImageView) view.findViewById(R.id.iv_t_2);
        image3 = (ImageView) view.findViewById(R.id.iv_t_3);

        imageViewList.add(image1);
        imageViewList.add(image2);
        imageViewList.add(image3);
    }
    else if (feed.imageIds.length == 4){
        view = inflater.inflate(R.layout.template_fourimage1, imagesLayout, false);
        imageViewList.clear();
        image1 = (ImageView) view.findViewById(R.id.iv_t_1);
        image2 = (ImageView) view.findViewById(R.id.iv_t_2);
        image3 = (ImageView) view.findViewById(R.id.iv_t_3);
        image4 = (ImageView) view.findViewById(R.id.iv_t_4);

        imageViewList.add(image1);
        imageViewList.add(image2);
        imageViewList.add(image3);
        imageViewList.add(image4);
    }
    else {
        view = inflater.inflate(R.layout.template_fiveimage, imagesLayout, false);
        imageViewList.clear();
        image1 = (ImageView) view.findViewById(R.id.iv_t_1);
        image2 = (ImageView) view.findViewById(R.id.iv_t_2);
        image3 = (ImageView) view.findViewById(R.id.iv_t_3);
        image4 = (ImageView) view.findViewById(R.id.iv_t_4);
        image5 = (ImageView) view.findViewById(R.id.iv_t_5);

        imageViewList.add(image1);
        imageViewList.add(image2);
        imageViewList.add(image3);
        imageViewList.add(image4);
        imageViewList.add(image5);
    }

    imagesLayout.addView(view);

    for (int i=0; i<feed.imageIds.length; i++){
        //load image using imageloader

        //use specific imageid in imagepath
        String format = feed.imageFormat.replace("{image_id}",String.valueOf(feed.imageIds[i]));

        ImageLoader.getInstance().displayImage(format,imageViewList.get(i), Utility.displayImageOptions);
    }

    return convertView;
}

Upvotes: 0

Views: 51

Answers (1)

Gordak
Gordak

Reputation: 2070

Not sure about this, but I think the problem comes from this line :

imagesLayout.addView(view);

As the view are recycled, every time you "create" a view, you add y list of imagesviews to the layout.

You should not clear your cache every time you create a View by the way.

 ImageLoader.getInstance().clearDiskCache();
 ImageLoader.getInstance().clearMemoryCache();

Upvotes: 1

Related Questions