Android lazyloading在gridview中的图像是滚动条上的混合位置
在我的应用程序中,我很懒地将图像从URL加载到gridview中。 当我滚动gridView时,图像会改变位置。 这怎么可能? 我是android新手,有人能帮我吗 这是我的列表适配器代码: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
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 nullconvertView
后设置这些值
由于您正在if块中设置ImageView的url:
imageLoader.DisplayImage(mStrings[position], imageView);
如果
convertView
不为空,即如果GridView开始回收视图,您将得到旧的convertView
,它不在屏幕上,并且其图像url不同,问题是您的GridView回收视图以更快地显示。必须为imageView设置一个标记,并检查图像url是否与惰性实现中加载的相同。这是因为图像下载是在异步任务中进行的,并且可能在图像下载时视图已经被回收
希望有帮助。尝试使用视图固定器模式。