listview中的android-ImageView在向上和向下滚动时不显示图像

时间:2015-08-31 05:14:49

标签: android android-listview

我通过universalImageDownloader从互联网上获取图像,我正在使用ViewHolder来显示它们:

public class ListAdapter2 extends BaseAdapter {
    Activity activity;
    public ArrayList<HashMap<String, String>> list;

    public ListAdapter2(Activity activity, ArrayList<HashMap<String, String>> list) {
        super();
        this.activity = getActivity();
        this.list = list;
    }

    public HashMap<String, String> geting(int position) {
        return list.get(position);
    }

    public void addAll(ArrayList<HashMap<String, String>> result) {
        if (this.list == null) {
            this.list = result;
        } else {
            this.list.addAll(result);
        }
        notifyDataSetChanged();
    }

    public int getCount() {
        return list.size();
    }

    public Object getItem(int position) {
        return list.get(position);
    }

    public long getItemId(int arg0) {
        return 0;
    }

    private class ViewHolder {
        ImageView img;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        LayoutInflater inflater = activity.getLayoutInflater();
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.row_grids, null);
            holder = new ViewHolder();
            holder.img = (ImageView) convertView.findViewById(R.id.image);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        item = list.get(position);

        if(item.get("img").length()>0)
            imageLoader.displayImage("http://website.com/img/" + item.get("img"), holder.img, options,
                imageListener);
        else
            holder.img.setImageDrawable(getResources().getDrawable(R.drawable.fix));
        }

        return convertView;
    }

    public void clear() {
        if (this.list.size() > 0)
            this.list.clear();
    }
}

private static class ImageDisplayListener extends SimpleImageLoadingListener {

    static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());

    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        if (loadedImage != null) {
            ImageView imageView = (ImageView) view;
            boolean firstDisplay = !displayedImages.contains(imageUri);
            if (firstDisplay) {
                FadeInBitmapDisplayer.animate(imageView, 500);
                displayedImages.add(imageUri);
            }
        }
    }
}

我已经用3部手机测试了它并且工作正常但是当我在朋友的手机上测试时,有时其中一张图片没有显示。

例如,当我来到活动时,它会显示所有图像,当我向下滚动最后一个项目不再显示的位置时,然后我向上滚动,突然之前显示的一个图像不再显示了它显示它的默认图像。

这段代码有什么问题吗? 顺便说一句,我有4个选项卡,这会在选项卡中发生。

谢谢

2 个答案:

答案 0 :(得分:2)

displayImage方法的问题,在某些情况下无法正确编码URL ..更好的approch你应该使用Picasso库

如果您正在使用android studio,请添加

  

编译'com.squareup.picasso:picasso:2.5.2'

在build.gradle文件中并同步:

或者Picasso Site下载eclipse的Jar文件

之后,您可以使用Picasso库并用

替换您的行
if(item.get("img").length()>0)
        imageLoader.displayImage("http://website.com/img/" + item.get("img"), holder.img, options,
            imageListener);
    else
        holder.img.setImageDrawable(getResources().getDrawable(R.drawable.fix));
    }

 String imgUrl = "http://website.com/img/" + item.get("img");
    if (!imgUrl.equals(""))
        Picasso.with(activity).load(imgUrl).into(holder.img);
    else
        Picasso.with(activity).load(R.drawable.fix).into(holder.img );

答案 1 :(得分:0)

使用“lazyImageLoaderAdapter.notifyDataSetChanged();” 其中lazyImageLoaderAdapter是任何适配器的对象。