ListView 每個 Item 可能包含不同佈局(帶背景圖 / 不帶背景圖),且存在倒計時 Timer 每秒調用 adapter.notifyDataSetChanged()。結果:圖片**偶發性閃爍**,體驗極差。
// getView 內部
if (getItemViewType(position) == 0) { // 有活動佈局
// 圖片加載邏輯
if (!getItem(position).getActivitylist().equals(holder.product_relayout.getTag())) {
mBitmapUtils.display(holder.product_relayout, getItem(position).getActivitylist());
holder.product_relayout.setTag(getItem(position).getActivitylist());
}
if (!getItem(position).getActivitylist().equals(holder.product_newYear_img.getTag())) { // <-- 錯誤行
mBitmapUtils.display(holder.product_newYear_img, getItem(position).getActivitybg());
holder.product_newYear_img.setTag(getItem(position).getActivitybg());
}
}
第 2 個 if 判斷條件**錯誤引用了 getActivitylist()**,實際應比較 getActivitybg():
// 錯誤
!getItem(position).getActivitylist().equals(holder.product_newYear_img.getTag())
// 正確
!getItem(position).getActivitybg().equals(holder.product_newYear_img.getTag())
導致:product_newYear_img 的 Tag 永遠跟隨 Activitylist URL,而實際加載的是 Activitybg URL。當兩者不同步時,xUtils 會反覆取消/重發請求,產生閃爍。
TextView,避免整個 notifyDataSetChanged() 觸發完整重繪;ViewHolder 緩存已綁定的 ImageView,結合 setTag(URL) 防止列表複用時圖片錯位;RecyclerView + Glide/Picasso/Coil,原生支援異步加載、內存緩存、佔位圖與動畫,徹底解決閃爍。convertView != null 時直接取 Tag,避免重複 findViewById;holder.product_time.setText(...),配合 handler.postDelayed 替代 Timer,減少 UI 線程壓力。