核心方法
public class MyAdapter extends BaseAdapter {
private static final int TYPE_TEXT = 0;
private static final int TYPE_IMAGE = 1;
private static final int TYPE_VIDEO = 2;
@Override public int getViewTypeCount() { return 3; }
@Override public int getItemViewType(int position) {
Item item = getItem(position);
if (item.isText()) return TYPE_TEXT;
if (item.isImage()) return TYPE_IMAGE;
return TYPE_VIDEO;
}
@Override public View getView(int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
switch (type) {
case TYPE_TEXT: convertView = inflate(R.layout.item_text); break;
case TYPE_IMAGE: convertView = inflate(R.layout.item_image); break;
case TYPE_VIDEO: convertView = inflate(R.layout.item_video); break;
}
holder.bind(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
// 可選:若 convertView 類型不匹配(極少見),重新 inflate
}
holder.fillData(getItem(position));
return convertView;
}
}
關鍵點
getViewTypeCount 返回類型總數,系統為每類型維護獨立回收池。getItemViewType 必須穩定:同一 position 永遠返回相同類型。- 使用
ViewHolder 緩存 findViewById 結果,提升滑動流暢度。