GridView、ListView数据更新图片闪烁问题

来源:互联网 发布:adsafe mac版 编辑:程序博客网 时间:2024/06/08 02:07

新功能是选择图片上传,选择完图片在上传前可以对已选择的图片进行删除。删除图片后,调用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());        }
原创粉丝点击