Android gridview中的图像在滚动时被替换

Android gridview中的图像在滚动时被替换,android,android-gridview,Android,Android Gridview,我已经编码在gridview中显示了一些图像。图像是从URL显示的。 我面临的问题是,当我滚动时,图像会被替换。。一旦开始,图像的顺序就会不断变化。。如果单击网格中的任何图像,这将导致整个图像显示延迟。。 请帮忙 代码: public class ImageAdapter extends BaseAdapter { private Context mContext; private TextView txtUrl; private String response;

我已经编码在gridview中显示了一些图像。图像是从URL显示的。 我面临的问题是,当我滚动时,图像会被替换。。一旦开始,图像的顺序就会不断变化。。如果单击网格中的任何图像,这将导致整个图像显示延迟。。 请帮忙

代码:

public class ImageAdapter extends BaseAdapter {

    private Context mContext;
    private TextView txtUrl;
    private String response;
    public ImageView imageView;
    public static String[] mThumbIds;
    public ImageAdapter(Context c,String resp) {
        mContext = c;
        response = resp.trim();
        mThumbIds = resp.split(",");
    }

    public int getCount() {
        return mThumbIds.length;
    }

    public Object getItem(int position) {
        return null;
    }

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

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {  // if it's not recycled, initialize some attributes
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(95, 95));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(6, 6, 6, 6);
        } else {
            imageView = (ImageView) convertView;
        }


        try {
             new LoadImageGrid(imageView).execute(mThumbIds[position]);

        } catch(Exception e) {
            txtUrl.setText("Error: Exception");
        }

        return imageView;

    }



class LoadImageGrid extends AsyncTask<String, Void, Drawable>
{

    ImageView imageView;
    public LoadImageGrid(ImageView im){
        imageView = im;
    }
    @Override
    protected Drawable doInBackground(String... args) {
        String url = args[0];
        Drawable d = null;
        try {
            d = Drawable.createFromStream((InputStream) new URL(url).getContent(), "src");
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return d;

    }


    @Override
    protected void onPostExecute(Drawable d) {
        imageView.setImageDrawable(d);
    }
公共类ImageAdapter扩展了BaseAdapter{
私有上下文;
私有文本视图txtUrl;
私有字符串响应;
公共影像视图;
公共静态字符串[]mThumbIds;
公共ImageAdapter(上下文c,字符串resp){
mContext=c;
响应=响应微调();
mThumbIds=分别拆分(“,”);
}
public int getCount(){
返回mThumbIds.length;
}
公共对象getItem(int位置){
返回null;
}
公共长getItemId(int位置){
返回0;
}
//为适配器引用的每个项目创建新的ImageView
公共视图getView(int位置、视图转换视图、视图组父视图){
如果(convertView==null){//如果它没有被回收,初始化一些属性
imageView=新的imageView(mContext);
setLayoutParams(新的GridView.LayoutParams(95,95));
imageView.setScaleType(imageView.ScaleType.CENTER\U裁剪);
设置填充(6,6,6,6);
}否则{
imageView=(imageView)convertView;
}
试一试{
新建LoadImageGrid(imageView).execute(mThumbIds[position]);
}捕获(例外e){
setText(“错误:异常”);
}
返回图像视图;
}
类LoadImageGrid扩展了AsyncTask
{
图像视图图像视图;
公共加载ImageGrid(ImageView im){
imageView=im;
}
@凌驾
受保护的可抽出式doInBackground(字符串…args){
字符串url=args[0];
可提取d=null;
试一试{
d=Drawable.createFromStream((InputStream)新URL(URL).getContent(),“src”);
}捕获(格式错误){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回d;
}
@凌驾
后期执行时受保护的无效(可提取d){
imageView.setImageDrawable(d);
}

这似乎与convert view有关。当您使用convert view为图像重新使用空间时,您应该在该范围内使用Imageview。我建议您在当前类代码中按其id查找Imageview,然后对其进行填充。

当您滚动网格视图时,不可见的图像视图将返回到getVView()作为convertView参数。但您的asyncTask不会停止,并调用

imageView.setImageDrawable(d);

导致将下载的图像应用到错误位置的视图。因为现在您重复使用了相同的imageView。快速修复方法不是使用convertView。但它会使您的应用程序慢一点。

这样的情况会发生,您需要缓存图像。请尝试使用android可用的任何图像下载库,如universal image downloader,您将使用的库查找懒散列表没有正确地理解你。我是android开发新手:/n你能通过显示一些代码来描述一下吗扫描你请告诉我哪些应用程序不会变慢,因为将来我会增加网格中显示的图像数量。如果不使用convertview,我怎么做呢?我不认为,性能会下降非常简单。您不需要使用复杂的布局,而且创建单个ImageView的速度非常快。顺便说一句,每次在屏幕上显示图像时都加载图像是一种不好的做法。您应该缓存下载的图像。下面是一个相关的线程:。不,我不想缓存图像。您能告诉我在e存在代码以便我可以摆脱此问题..如何在不使用covertview的情况下执行此操作?只需删除
if(convertView==null){
}否则{imageView=(imageView)convertView;}
我采用了您的方法,但当我向下滚动然后向上滚动时,图像消失了。这些图像显示在网格的开头:/