在我的应用程序中,我懒得将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);
}
}
由于
答案 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中,并且可能在图像下载时,视图已经被回收。
希望它有所帮助。