Android lazyloading在gridview中的图像是滚动条上的混合位置

Android lazyloading在gridview中的图像是滚动条上的混合位置,android,Android,在我的应用程序中,我很懒地将图像从URL加载到gridview中。 当我滚动gridView时,图像会改变位置。 这怎么可能? 我是android新手,有人能帮我吗 这是我的列表适配器代码: import android.app.Activity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClic

在我的应用程序中,我很懒地将图像从URL加载到gridview中。 当我滚动gridView时,图像会改变位置。 这怎么可能? 我是android新手,有人能帮我吗

这是我的列表适配器代码:

import android.app.Activity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView;   public class LazyImageLoadAdapter extends BaseAdapter implements OnClickListener{

    private Activity activity;
    private String[] mStrings;
    private Context mContext;
    private static LayoutInflater inflater=null;
    public ImageLoader imageLoader;

    public LazyImageLoadAdapter(Context context, Activity a, String[] d) {
        activity = a;
        mStrings=d;
        mContext = context;
        inflater = (LayoutInflater)activity.
                            getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        imageLoader = new ImageLoader(activity.getApplicationContext());
    }

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

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

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

    public View getView(int position, View convertView, ViewGroup parent)
    {    
        View grid;
        inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null)
        {
            grid = new View(mContext);
            grid = inflater.inflate(R.layout.listview_row, null);
            ImageView imageView = (ImageView)grid.findViewById(R.id.image);
            imageLoader.DisplayImage(mStrings[position], imageView);
        } else {
            grid = (View) convertView;
        }

        grid.setOnClickListener(new OnItemClickListener(position));
        return grid;
    }

    @Override
    public void onClick(View arg0) {

    }


    private class OnItemClickListener  implements OnClickListener{          
        private int mPosition;

       OnItemClickListener(int position){
             mPosition = position;
        }

        @Override
        public void onClick(View arg0) {
            MainActivityLoading sct = (MainActivityLoading)activity;
            sct.onItemClick(mPosition);
        }              
    }   
谢谢

这应该可以:

public View getView(int position, View convertView, ViewGroup parent) {
    inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.listview_row, null);
    }

    ImageView imageView = (ImageView)convertView.findViewById(R.id.image);
    imageLoader.DisplayImage(mStrings[position], imageView);


    //Use gridView's setOnItemClickListener
    //convertView.setOnClickListener(new OnItemClickListener(position));
    return convertView;
}
这里的要点是,您必须在获得not null
convertView
后设置这些值

由于您正在if块中设置ImageView的url:

imageLoader.DisplayImage(mStrings[position], imageView);

如果
convertView
不为空,即如果GridView开始回收视图,您将得到旧的
convertView
,它不在屏幕上,并且其图像url不同

,问题是您的GridView回收视图以更快地显示。必须为imageView设置一个标记,并检查图像url是否与惰性实现中加载的相同。这是因为图像下载是在异步任务中进行的,并且可能在图像下载时视图已经被回收


希望有帮助。

尝试使用视图固定器模式。