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

Android 空指標異常排查:GridView 與 Adapter 綁定錯誤完整分析

     編輯:程式設計綜合問答

錯誤現象

點擊 GridView 項目時發生 `NullPointerException`,Logcat 指向 `OnItemClickListener` 內部。程式碼片段:

GridView list = findViewById(R.id.list);
MyAdapter gAdapter = new MyAdapter(dev_list, this);
list.setAdapter(gAdapter);

final Integer[] images = {R.id.on, R.id.off, R.id.voice};
dev_list.setOnItemClickListener(...); // 問題行

核心問題:變數混淆與錯誤綁定

  1. 監聽器綁定對象錯誤:程式碼對 `dev_list` 設定 `OnItemClickListener`,但 `dev_list` 從未初始化(或非 GridView)。真正的 GridView 變數是 `list`。
  2. Adapter 建構子參數不符:`new MyAdapter(dev_list, this)` 傳入 `dev_list`,但 `dev_list` 可能是資料集合而非 Context。
  3. 位置索引邏輯錯誤:`images[position]` 假設 GridView 項目順序與陣列一一對應,但 Adapter 實際資料來源若不同步會導致索引越界或顯示錯誤。

修正後程式碼

public class MainActivity extends FragmentActivity {
    private GridView gridView;
    private MyAdapter adapter;
    private List<Device> deviceList; // 假設資料模型

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);

        gridView = findViewById(R.id.list);
        deviceList = loadDevices(); // 從資料庫/網路載入

        // 正確:傳入資料集合與 Context
        adapter = new MyAdapter(deviceList, this);
        gridView.setAdapter(adapter);

        // 正確:對 gridView 設定監聽器
        gridView.setOnItemClickListener((parent, view, position, id) -> {
            Device device = deviceList.get(position);
            // 依裝置屬性決定行為,而非死板陣列索引
            handleDeviceClick(device);
        });
    }

    private void handleDeviceClick(Device device) {
        String msg;
        switch (device.getType()) {
            case ON:  msg = "說話"; break;
            case OFF: msg = "停止"; break;
            case VOICE: msg = "聽話"; break;
            default:  msg = "未知"; break;
        }
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }
}

關鍵修正點總結

原始錯誤修正做法理由
`dev_list.setOnItemClickListener``gridView.setOnItemClickListener`監聽器必須綁定在實際顯示的 View 上
`new MyAdapter(dev_list, this)``new MyAdapter(deviceList, this)`Adapter 需要資料集合,第一參數通常為 List<T>
`images[position]` 硬編碼從資料模型 `device.getType()` 取得資料驅動 UI,解耦合順序依賴
未檢查 `deviceList` 空值載入資料後檢查 `isEmpty()`防止 NPE 與空白列表

除錯建議

  1. 在 `onCreate` 結束前加上 `Log.d("TAG", "deviceList size: " + deviceList.size());`
  2. 使用 Android Studio Debug 模式在 `setOnItemClickListener` 斷點檢查 `position` 與 `deviceList.get(position)`
  3. 檢查 `activity_list.xml` 中 GridView `id` 是否為 `@+id/list`
  4. 若 `MyAdapter` 為自訂類別,確認 `getView()` 正確繫結資料到項目 View
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved