1. 程式人生 > >GridView、ListView資料更新圖片閃爍問題

GridView、ListView資料更新圖片閃爍問題

新功能是選擇圖片上傳,選擇完圖片在上傳前可以對已選擇的圖片進行刪除。刪除圖片後,呼叫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());
        }