新功能是选择图片上传,选择完图片在上传前可以对已选择的图片进行删除。删除图片后,调用notifyDataSetChanged 通知UI数据更改。
是用Imageloader展示图片。
因为执行notifyDataSetChanged 后,GridView、ListView重新执行了getView 方法,getView 图片又重新加载。所以会出现图片会有闪烁。
解决方法是给图片setTag ,在getview里面,判断要加载的图片的tag是否相同。
修改之前:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(context)
.inflate(R.layout.item_car_image_upload,
parent, false);
holder = new ViewHolder();
holder.image = (ImageView) convertView
.findViewById(R.id.item_grida_image);
holder.delete= (ImageView) convertView
.findViewById(R.id.delete_icon_image);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//notifyDataSetChanged后,执行getView,会重新加载闪烁
ImageLoader.getInstance().displayImage(
imageInfoList.get(position).toString(), holder.image);
return convertView;
}
修改之后
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
.inflate(R.layout.item_car_image_upload,
parent, false);
holder = new ViewHolder();
holder.image = (ImageView) convertView
.findViewById(R.id.item_grida_image);
holder.delete= (ImageView) convertView
.findViewById(R.id.delete_icon_image);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//判断tag,决定是否重新加载
if (imageInfoList.get(position).toString()
.equals(holder.image.getTag())) {
}
else {
//加载图片 ImageLoader.getInstance().displayImage( imageInfoList.get(position).toString(),holder.image);
//使用图片的资源地址url或者本地地址作为tag holder.image.setTag(imageInfoList.get(position).toString());
}
return convertView;
}
作为viewholder的tag的内容,其实不一定要是图片的url,之前因为图片重复,url可能重复,使用数据源里面的id作为tag更准确一些。
类似于这样,使用Car_id作为tag,决定数据是否需要加载
if ((viewHolder.image_app_small.getTag()!=null&&overseaCarInfos.get(position)!=null&&
overseaCarInfos.get(position).getCar_id()!=null&&overseaCarInfos.get(position).getCar_id().equals(viewHolder.image_app_small.getTag())
)) {
} else {
// 如果不相同,就加载。现在在这里来改变闪烁的情况
ImageLoader.getInstance().displayImage(overseaCarInfos.get(position).getImage_url_app_small(), viewHolder.image_app_small);
viewHolder.image_app_small.setTag(overseaCarInfos.get(position).getCar_id());
viewHolder.car_price.setText(overseaCarInfos.get(position).getPrice());
viewHolder.overease_car_name.setText(overseaCarInfos.get(position).getName_cn());
}