首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android ListView 使用 xUtils 圖片加載閃爍問題根因與修復

     編輯:程式設計疑難解答

現象描述

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 會反覆取消/重發請求,產生閃爍。

修復方案

  1. 修正判斷條件,確保 Tag 與實際加載 URL 一一對應;
  2. 優化倒計時刷新:僅更新時間文本的 TextView,避免整個 notifyDataSetChanged() 觸發完整重繪;
  3. 使用 ViewHolder 緩存已綁定的 ImageView,結合 setTag(URL) 防止列表複用時圖片錯位;
  4. 若圖片較多,建議遷移至 RecyclerView + Glide/Picasso/Coil,原生支援異步加載、內存緩存、佔位圖與動畫,徹底解決閃爍。

最佳實踐補充

  • 異步加載庫選型:xUtils 早已停止維護,推薦 Glide(Google 官方推薦)或 Coil(Kotlin 協程優先);
  • 列表複用核心:convertView != null 時直接取 Tag,避免重複 findViewById;
  • 局部刷新:倒計時僅需 holder.product_time.setText(...),配合 handler.postDelayed 替代 Timer,減少 UI 線程壓力。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved