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

Android ListView 優化:ViewHolder 模式復用 convertView 減少 findViewById

     編輯:程式設計疑難解答

優化前痛點

  • 每次 getView 都 inflate 新 View,GC 壓力大。
  • 重複 findViewById,UI 線程卡頓。

ViewHolder 模式標準寫法

static class ViewHolder {
    ImageView img;
    TextView title, info;
    Button btn;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.vlist2, parent, false);
        holder = new ViewHolder();
        holder.img   = convertView.findViewById(R.id.img);
        holder.title = convertView.findViewById(R.id.title);
        holder.info  = convertView.findViewById(R.id.info);
        holder.btn   = convertView.findViewById(R.id.view_btn);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    Data d = getItem(position);
    holder.img.setImageResource(d.imgRes);
    holder.title.setText(d.title);
    holder.info.setText(d.info);
    holder.btn.setOnClickListener(v -> showInfo());

    return convertView;
}

核心要點

  1. inflate(layout, parent, false) 第三參數 false 避免重複添加到父佈局。
  2. setTag/getTag 綁定 Holder,實現 O(1) 獲取子 View。
  3. 異步加載圖片時,給 ImageView 標記 setTag(url),回調中比對防止錯位。

進階:RecyclerView 替代

新項目首選 RecyclerView + Adapter + ViewHolder(強制模式),性能更強、API 更清晰、支持動畫、分佈式佈局管理器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved