ListView图像在滚动过程中发生变化 [英] ListView images changing During Scroll

查看:73
本文介绍了ListView图像在滚动过程中发生变化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试使用asyntask将其动态图像制作成带有动态图像的listview,并将其设置为listview.我的问题是,向下滚动图像会随机更改.

class ps1 extends ArrayAdapter<String> {
    Context context;
    String[] images1;
    List mList;
    String[] namearray;
    String[] rating;

    static class ViewHolder {
        ImageView localImageView1;
        ImageView localImageView2;
        ImageView localImageView3;
    }

    ps1(Context paramContext, String[] paramArrayOfString1, String[] paramArrayOfString2, String[] paramArrayOfString3) {
        super(paramContext, R.layout.list2, R.id.imageView1, paramArrayOfString1);
        this.context = paramContext;
        this.images1 = paramArrayOfString3;
        this.namearray = paramArrayOfString1;
        this.rating = paramArrayOfString2;
    }

    public View getView(int paramInt, View paramView, ViewGroup paramViewGroup) {
    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(context.LAYOUT_INFLATER_SERVICE);

    ViewHolder viewHolder = new ViewHolder();
    if (paramView == null) {
        paramView = inflater.inflate(R.layout.list2, paramViewGroup, false);

    }


    viewHolder.localImageView1 = (ImageView) paramView
            .findViewById(R.id.imageView1);
    viewHolder.localImageView2 = (ImageView) paramView
            .findViewById(R.id.imageView2);
    viewHolder.localImageView3 = (ImageView) paramView
            .findViewById(R.id.imageView3);


    viewHolder.localImageView1.setScaleType(ImageView.ScaleType.FIT_XY);
    viewHolder.localImageView2.setScaleType(ImageView.ScaleType.FIT_XY);
    viewHolder.localImageView3.setScaleType(ImageView.ScaleType.FIT_XY);

    viewHolder.localImageView1.setTag(this.namearray[paramInt]);
    new LoadImage().execute(viewHolder.localImageView1);
    viewHolder.localImageView2.setTag(this.rating[paramInt]);
    new LoadImage().execute(viewHolder.localImageView2);
    viewHolder.localImageView3.setTag(this.images1[paramInt]);
    new LoadImage().execute(viewHolder.localImageView3);


    return paramView;
    }
    }

    class LoadImage extends AsyncTask<Object, Void, Bitmap> {
    private ImageView imv;

    private Bitmap download_Image(String paramString) {
    Bitmap localBitmap = null;
    try {
        Object localObject = null;
        localBitmap = BitmapFactory
                .decodeStream(((HttpURLConnection) new URL(paramString)
                        .openConnection()).getInputStream());
        localObject = localBitmap;
        if (localObject != null) {
            return localBitmap;
        }
    } catch (Exception e) {

    }
    return localBitmap;
    }

    protected Bitmap doInBackground(Object... paramVarArgs) {
    this.imv = ((ImageView) paramVarArgs[0]);
    Log.d("fsdf", (String) this.imv.getTag());
    return download_Image((String) this.imv.getTag());
    }

    protected void onPostExecute(Bitmap paramBitmap) {
    this.imv.setImageBitmap(paramBitmap);
    }
}

解决方案

我也经历过同样的事情.我也在寻找正确的解决方案.据我搜索,我知道ListView会在向下滚动时清除上一个视图,并在您向后滚动时重新加载它.因此,在上下滚动时,您的图像可能会被回收并重新对齐. (我也在等待正确的解决方案.)

但是我已经使用 SmartImageView 解决了该问题,该库是直接下载的图像并将其设置为ImageView.它将图像保存在缓存中,因此您可以获得正确的图像.

相比之下,这也更快.

im try to make listview with dynamic images, using asyntask its download image and set into listview. my problem is while scroll down images get randomly changed..

class ps1 extends ArrayAdapter<String> {
    Context context;
    String[] images1;
    List mList;
    String[] namearray;
    String[] rating;

    static class ViewHolder {
        ImageView localImageView1;
        ImageView localImageView2;
        ImageView localImageView3;
    }

    ps1(Context paramContext, String[] paramArrayOfString1, String[] paramArrayOfString2, String[] paramArrayOfString3) {
        super(paramContext, R.layout.list2, R.id.imageView1, paramArrayOfString1);
        this.context = paramContext;
        this.images1 = paramArrayOfString3;
        this.namearray = paramArrayOfString1;
        this.rating = paramArrayOfString2;
    }

    public View getView(int paramInt, View paramView, ViewGroup paramViewGroup) {
    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(context.LAYOUT_INFLATER_SERVICE);

    ViewHolder viewHolder = new ViewHolder();
    if (paramView == null) {
        paramView = inflater.inflate(R.layout.list2, paramViewGroup, false);

    }


    viewHolder.localImageView1 = (ImageView) paramView
            .findViewById(R.id.imageView1);
    viewHolder.localImageView2 = (ImageView) paramView
            .findViewById(R.id.imageView2);
    viewHolder.localImageView3 = (ImageView) paramView
            .findViewById(R.id.imageView3);


    viewHolder.localImageView1.setScaleType(ImageView.ScaleType.FIT_XY);
    viewHolder.localImageView2.setScaleType(ImageView.ScaleType.FIT_XY);
    viewHolder.localImageView3.setScaleType(ImageView.ScaleType.FIT_XY);

    viewHolder.localImageView1.setTag(this.namearray[paramInt]);
    new LoadImage().execute(viewHolder.localImageView1);
    viewHolder.localImageView2.setTag(this.rating[paramInt]);
    new LoadImage().execute(viewHolder.localImageView2);
    viewHolder.localImageView3.setTag(this.images1[paramInt]);
    new LoadImage().execute(viewHolder.localImageView3);


    return paramView;
    }
    }

    class LoadImage extends AsyncTask<Object, Void, Bitmap> {
    private ImageView imv;

    private Bitmap download_Image(String paramString) {
    Bitmap localBitmap = null;
    try {
        Object localObject = null;
        localBitmap = BitmapFactory
                .decodeStream(((HttpURLConnection) new URL(paramString)
                        .openConnection()).getInputStream());
        localObject = localBitmap;
        if (localObject != null) {
            return localBitmap;
        }
    } catch (Exception e) {

    }
    return localBitmap;
    }

    protected Bitmap doInBackground(Object... paramVarArgs) {
    this.imv = ((ImageView) paramVarArgs[0]);
    Log.d("fsdf", (String) this.imv.getTag());
    return download_Image((String) this.imv.getTag());
    }

    protected void onPostExecute(Bitmap paramBitmap) {
    this.imv.setImageBitmap(paramBitmap);
    }
}

解决方案

I have also experienced the same . I am also searching for a right solution . As far as i have searched , i came to know that ListView clears the previous view while scrolling down and re-loads it when you scroll back . So while scrolling up and down, your images may get re-cycled and mis-aligned . ( I am also waiting for the correct solution ) .

But i have tackled it using SmartImageView , which is a library that directly downloads the image and sets it to the ImageView . It will maintain the images in cache and so you could get the right images .

Comparatively this was faster too .

这篇关于ListView图像在滚动过程中发生变化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆