在 onCreate 中直接調用 adapter.add() 會觸發 notifyDataSetChanged(),但此時 ListView 尚未完成佈局初始化,導致崩潰。
adapter = new ArrayAdapter<AlarmData>(getContext(), android.R.layout.simple_list_item_1);
lvListView.setAdapter(adapter);
adapter.add(new AlarmData(System.currentTimeMillis())); // 崩潰點
// 1. 先準備數據
List<AlarmData> dataList = new ArrayList<>();
dataList.add(new AlarmData(System.currentTimeMillis()));
// 2. 再創建適配器並綁定數據
adapter = new ArrayAdapter<AlarmData>(this,
android.R.layout.simple_list_item_1, dataList); // 傳入列表
// 3. 最後設置給 ListView
lvListView.setAdapter(adapter);
ArrayAdapter(Context, int, List<T>) 內部直接持有引用,無需後續 add()this (Activity):原代碼 getContext() 返回 null 會導致 NPEonCreate 階段 View 尚未 attach 到窗口// 按鈕點擊添加新鬧鐘
btnAddAlarm.setOnClickListener(v -> {
AlarmData newAlarm = new AlarmData(System.currentTimeMillis());
dataList.add(newAlarm); // 修改數據源
adapter.notifyDataSetChanged(); // 通知 UI 更新
});
// 原代碼錯誤
private Context getContext() { return null; }
// 修正:直接使用 Activity 實例 (this) 或 getApplicationContext()
adapter = new ArrayAdapter<>(MainActivity.this, ...);
「先備數據,後建適配器,最後綁定視圖」是 Android 列表開發的鐵律。ArrayAdapter.add() 適用於運行時動態增刪,初始化階段請使用構造函數注入列表。