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

Android ListView NullPointerException?檢查 Adapter 建構子參數順序

     編輯:程式設計綜合問答

錯誤現象

fList.setAdapter(la) 拋出 NullPointerException,但 Log 確認資料陣列已正確填入。

問題根因

自訂 ArrayAdapter 建構子呼叫順序錯誤:

// 錯誤:第三參數傳入 R.id.Author_list (TextView resource ID)
ListAdapter1 la = new ListAdapter1(this, R.id.Author_list, aList);

ArrayAdapter(Context, int resource, List<T>) 的第二參數應為 項目版面資源 ID (如 android.R.layout.simple_list_item_1),而非容器 ListView 的 ID。

修正程式碼

public class Forfattere extends Activity {
    ListView fList;
    ListAdapter1 la;
    ArrayList<String> aList = new ArrayList<>();

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

        fList = (ListView) findViewById(R.id.Author_list);
        // 填入資料...
        for (String s : DBlistbookfestival.getAuthorName()) {
            aList.add(s);
        }

        // 正確:使用系統內建單行文字版面
        la = new ListAdapter1(this, android.R.layout.simple_list_item_1, aList);
        fList.setAdapter(la);
    }

    private class ListAdapter1 extends ArrayAdapter<String> {
        public ListAdapter1(Context context, int resource, List<String> list) {
            super(context, resource, list);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // 建議使用 ViewHolder 模式優化效能
            return super.getView(position, convertView, parent);
        }
    }
}

補充建議

  • 若需自訂項目版面,請建立專屬 XML (如 R.layout.custom_row) 並傳入建構子
  • 務必實作 ViewHolder 避免重複 findViewById
  • 考慮改用 RecyclerView + Adapter 取代 ListView,支援更彈性的佈局與動畫
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved