常見原因排查
- Adapter.getCount() 返回 0:數據源列表為空或未正確賦值。
- getView() 返回 null:忘記
return convertView; 或邏輯分支缺少返回。
- ViewHolder 使用錯誤:未正確
setTag/getTag,導致 findViewById 重複或控件為空。
- ListView 高度為 0:父佈局
wrap_content 但 ListView 在 ScrollView 中 (需展開)。
標準 Adapter 寫法
public class MyAdapter extends BaseAdapter {
private List<String> data;
private LayoutInflater inflater;
public MyAdapter(Context ctx, List<String> data) {
this.data = data;
inflater = LayoutInflater.from(ctx);
}
@Override public int getCount() { return data.size(); }
@Override public Object getItem(int pos) { return data.get(pos); }
@Override public long getItemId(int pos) { return pos; }
@Override
public View getView(int pos, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.item, parent, false);
holder = new ViewHolder();
holder.tv1 = convertView.findViewById(R.id.tv1);
holder.tv2 = convertView.findViewById(R.id.tv2);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tv1.setText(data.get(pos));
holder.tv2.setText("Index: " + pos);
return convertView; // 關鍵:必須返回
}
static class ViewHolder {
TextView tv1, tv2;
}
}
調試技巧
- 在
getCount、getView 加日誌打印位置參數。
- 用
Hierarchy Viewer 或 Layout Inspector 檢查 ListView 實際高度與子 View 結構。