GridView、ListView資料更新圖片閃爍問題
阿新 • • 發佈:2019-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());
}