ArrayAdapter 拋 NullPointerException 且堆疊指向 Resources.getText,通常是 getView 中嘗試設置文本時資源 ID 錯誤,或數據源為空、布局 ID 不匹配。
null 或 size=0,導致 getView 不被調用或取值異常。
// 確保數據非空
if (ticketArray == null) ticketArray = new ArrayList<>();
adapter = new AdapterTicketList(this, ticketArray);
super(context, 0, ticketArray) 中 resource ID 為 0,需在 getView 手動 inflate,但若 rowticket.xml 中 TextView ID 與代碼 findViewById 不一致,會返回 null 導致 NPE。
// 檢查 rowticket.xml 是否包含 tvTicketID, tvCreationHour 等 ID
holder.tvTicketID = convertView.findViewById(R.id.tvTicketID); // 確保 ID 存在
String resource ID #0x11 表明傳給 setText 的是整數資源 ID 而非字符串,檢查是否誤用 R.string.xxx 而非 getString(R.string.xxx)。
// 1. 打印數據源大小
Log.d("Adapter", "ticketArray size: " + ticketArray.size());
// 2. 打印 convertView 結構
Log.d("Adapter", "convertView: " + convertView);
// 3. 逐個檢查 findViewById 返回值
TextView tv = convertView.findViewById(R.id.tvTicketID);
Log.d("Adapter", "tvTicketID: " + tv);
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.rowticket, parent, false); // 推薦 parent, false
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
POJO_Ticket item = getItem(position);
if (item != null) {
holder.tvTicketID.setText(String.valueOf(item.getId())); // 確保字符串
// ... 其他字段
}
return convertView;
}
系統排查數據源、布局 ID、資源類型,即可定位 NPE 根因。