首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android ArrayAdapter 空指針異常排查:布局文件與數據源綁定檢查

     編輯:程式設計綜合問答

ArrayAdapter 拋 NullPointerException 且堆疊指向 Resources.getText,通常是 getView 中嘗試設置文本時資源 ID 錯誤,或數據源為空、布局 ID 不匹配。

常見原因與排查

  1. 數據源為空:傳給 Adapter 的 List 為 null 或 size=0,導致 getView 不被調用或取值異常。
    // 確保數據非空
    if (ticketArray == null) ticketArray = new ArrayList<>();
    adapter = new AdapterTicketList(this, ticketArray);
    
  2. 布局文件錯誤: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 存在
    
  3. 資源 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 根因。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved