【问题标题】:Repeatable images in listview - Android列表视图中的可重复图像 - Android
【发布时间】:2015-07-10 06:42:47
【问题描述】:

我有一个ListView,其中包含从服务器下载的图像和文本。

文字看起来很好,不会重复,但图像会重复。我有模板布局来显示我根据收到的图像数量膨胀的图像。然而,在我的第三个列表条目(行)之后,图像开始重复自己。

这是我 ArrayAdapter 中的 getView() 方法

@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;
}

【问题讨论】:

标签: android listview


【解决方案1】:

对此不确定,但我认为问题出在这一行:

imagesLayout.addView(view);

当视图被回收时,每次“创建”视图时,都会将 y 个图像视图列表添加到布局中。

顺便说一句,你不应该在每次创建视图时都清除缓存。

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

【讨论】:

  • 在增加视图之前,我从imagesLayout 中删除了所有视图,这似乎有效。 imagesLayout.removeAllViews()。感谢您向我指出这一点
猜你喜欢
  • 2016-09-27
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
相关资源
最近更新 更多