在getView中异步加载本地图片就会出现错乱,但是用个list保存holder就不会,真搞不懂了
BaseAdapter adapter = new BaseAdapter() {
public int getCount() {
return mData.size() + 1;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return position;
}
// create a new ImageView for each item referenced by the Adapter
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
holder.image = (ImageView) mInflater.inflate(R.layout.image_make_house, parent, false);
holderList.add(holder);
holder.image.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//如果是最后一张图片
if (position == getCount() - 1) {
//数量是否是最大值+1
if (getCount() == (PHOTO_MAX_COUNT + 1)) {
//item设置不可见时不能触发OnItemClick
holder.image.setVisibility(View.INVISIBLE);
} else {
holder.image.setVisibility(View.VISIBLE);
holder.image.setImageResource(R.drawable.add_img);
holder.uri = "";
}
//不是最后一张
} else {
holder.image.setVisibility(View.VISIBLE);
PhotoData photoData = mData.get(position);
Uri data = photoData.uri;
holder.uri = data.toString();
final ImageView img = holder.image;
ImageLoader.getInstance().loadImage(data.toString(), mSize, new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
//这样写就会出现图片错位
img.setImageBitmap(loadedImage);
}
});
}
return holder.image;
}
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
//图片数量大于1则显示,只有1张或者没有则不显示
gridView.setVisibility(getCount() >= 1 ? View.VISIBLE : View.GONE);
}
class ViewHolder {
ImageView image;
String uri = "";
}
};
BaseAdapter adapter = new BaseAdapter() {
//这样就不会出错了
ArrayList<ViewHolder> holderList = new ArrayList<>();
public int getCount() {
return mData.size() + 1;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return position;
}
// create a new ImageView for each item referenced by the Adapter
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
holder.image = (ImageView) mInflater.inflate(R.layout.image_make_house, parent, false);
holderList.add(holder);
holder.image.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//如果是最后一张图片
if (position == getCount() - 1) {
//数量是否是最大值+1
if (getCount() == (PHOTO_MAX_COUNT + 1)) {
//item设置不可见时不能触发OnItemClick
holder.image.setVisibility(View.INVISIBLE);
} else {
holder.image.setVisibility(View.VISIBLE);
holder.image.setImageResource(R.drawable.add_img);
holder.uri = "";
}
//不是最后一张
} else {
holder.image.setVisibility(View.VISIBLE);
PhotoData photoData = mData.get(position);
Uri data = photoData.uri;
holder.uri = data.toString();
ImageLoader.getInstance().loadImage(data.toString(), mSize, new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
//这样就正常
for (ViewHolder item : holderList) {
if (item.uri.equals(imageUri)) {
item.image.setImageBitmap(loadedImage);
}
}
}
});
}
return holder.image;
}
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
//图片数量大于1则显示,只有1张或者没有则不显示
gridView.setVisibility(getCount() >= 1 ? View.VISIBLE : View.GONE);
}
class ViewHolder {
ImageView image;
String uri = "";
}
};
你可以将每一个图片的URL放入到image的tag中去,在显示这个image之前先判断一下当前的这个URL是不是与你之前存的那个tag是一致的,如果是一致的就不要加载了,但是具体是什么原理,你应该看一下adapter构造的过程。