錯誤代碼
@Override
public View getView(int position, View convertView, ViewGroup parent) {
textview = (TextView) findViewById(R.id.TextView); // 錯誤:在 Activity 佈局中找控件
textview.setText("position:" + position);
return textview; // 返回單一 TextView,非 Item 根佈局
}
問題
findViewById 在 Activity 視圖樹中查找,而非 Item 佈局。
- 返回單一
TextView,ListView 期望的是包含所有子控件的根 ViewGroup(如 LinearLayout)。
- 未使用
convertView 複用,效能極差。
正確實現
// 1. 定義 item_layout.xml
// <LinearLayout ...> <TextView android:id="@+id/tvItem" /> </LinearLayout>
static class ViewHolder {
TextView tvItem;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
holder = new ViewHolder();
holder.tvItem = convertView.findViewById(R.id.tvItem);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tvItem.setText("Position " + position);
return convertView; // 返回根佈局
}
關鍵點
- Item 佈局獨立 XML,根元素為
ViewGroup。
LayoutInflater.inflate(layoutId, parent, false) 參數 false 表示暫不附加到父視圖。
- ViewHolder 模式避免重複
findViewById。