getView 都 inflate 新 View,GC 壓力大。findViewById,UI 線程卡頓。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;
}
inflate(layout, parent, false) 第三參數 false 避免重複添加到父佈局。setTag/getTag 綁定 Holder,實現 O(1) 獲取子 View。ImageView 標記 setTag(url),回調中比對防止錯位。新項目首選 RecyclerView + Adapter + ViewHolder(強制模式),性能更強、API 更清晰、支持動畫、分佈式佈局管理器。