来自延迟加载的gridview中的图像是在滚动上混合的位置

时间:2014-07-25 07:02:49

标签: 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.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);
        }              
    }   

由于

2 个答案:

答案 0 :(得分:1)

这应该有效:

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

这里的要点是,一旦获得非空convertView,就必须设置值。

由于您在if块中设置了ImageView的网址:

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

如果convertView不为空,即如果 GridView 开始回收视图,您将获得不在屏幕上的旧convertView图片网址不同

答案 1 :(得分:0)

问题是您的gridview会回收视图以便更快地显示。您必须为imageView设置一个标记,并检查图像网址是否与您在延迟实现中加载的图像相对应。之所以发生这种情况,是因为图像下载发生在asynctask中,并且可能在图像下载时,视图已经被回收。

希望它有所帮助。