title: Android Zygote Runtime Error when adding item to listview using an alert dialog
body: <p>In this app I am trying to populate a listview with items using an alert dialog. Basically, when you click "add new" an alert dialog should pop up where you would enter some text. When you click confirm, it is suppose to add whatever text the user typed into the alert dialog box, into the listview. I used Google's sample notepad tutorial app for this and tried to change the code myself, but when I click confirm on the alert dialog, i get this error: </p>
  
  <p>06-08 16:54:47.516: E/AndroidRuntime(2509): FATAL EXCEPTION: main
  06-08 16:54:47.516: E/AndroidRuntime(2509): java.lang.NullPointerException
  06-08 16:54:47.516: E/AndroidRuntime(2509):     at com.android.demo.notepad2.Notepadv2$1.onClick(Notepadv2.java:146)
  06-08 16:54:47.516: E/AndroidRuntime(2509):     at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:185)
  06-08 16:54:47.516: E/AndroidRuntime(2509):     at android.os.Handler.dispatchMessage(Handler.java:99)
  06-08 16:54:47.516: E/AndroidRuntime(2509):     at android.os.Looper.loop(Looper.java:137)
  06-08 16:54:47.516: E/AndroidRuntime(2509):     at android.app.ActivityThread.main(ActivityThread.java:5293)
  06-08 16:54:47.516: E/AndroidRuntime(2509):     at java.lang.reflect.Method.invokeNative(Native Method)
  06-08 16:54:47.516: E/AndroidRuntime(2509):     at java.lang.reflect.Method.invoke(Method.java:511)
  06-08 16:54:47.516: E/AndroidRuntime(2509):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
  06-08 16:54:47.516: E/AndroidRuntime(2509):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
  06-08 16:54:47.516: E/AndroidRuntime(2509):     at dalvik.system.NativeStart.main(Native Method)</p>
  
  <p><strong>Notepadv2.java</strong></p>
  
  <pre><code>public class Notepadv2 extends ListActivity {
      private static final int ACTIVITY_CREATE=0;
      private static final int ACTIVITY_EDIT=1;
  
      private static final int INSERT_ID = Menu.FIRST;
      private static final int DELETE_ID = Menu.FIRST + 1;
  
      private NotesDbAdapter mDbHelper;
      private Cursor mNotesCursor;
      private EditText mTitleText;
      private EditText mBodyText;
      private Long mRowId;
  
      /** Called when the activity is first created. */
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.notes_list);
  
          mTitleText = (EditText) findViewById(R.id.title);
          mBodyText = (EditText) findViewById(R.id.body);
  
          mRowId = null;
          Bundle extras = getIntent().getExtras();
          if (extras != null) {
              String title = extras.getString(NotesDbAdapter.KEY_TITLE);
              String body = extras.getString(NotesDbAdapter.KEY_BODY);
              mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
  
              if (title != null) {
                  mTitleText.setText(title);
              }
              if (body != null) {
                  mBodyText.setText(body);
              }
          }
      }
  
      private void fillData() {
          // Get all of the rows from the database and create the item list
          mNotesCursor = mDbHelper.fetchAllNotes();
          startManagingCursor(mNotesCursor);
  
          // Create an array to specify the fields we want to display in the list (only TITLE)
          String[] from = new String[]{NotesDbAdapter.KEY_TITLE};
  
          // and an array of the fields we want to bind those fields to (in this case just text1)
          int[] to = new int[]{R.id.text1};
  
          // Now create a simple cursor adapter and set it to display
          SimpleCursorAdapter notes = 
              new SimpleCursorAdapter(this, R.layout.notes_row, mNotesCursor, from, to);
          setListAdapter(notes);
      }
  
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          super.onCreateOptionsMenu(menu);
          menu.add(0, INSERT_ID, 0, R.string.menu_insert);
          return true;
      }
  
      @Override
      public boolean onMenuItemSelected(int featureId, MenuItem item) {
          switch(item.getItemId()) {
              case INSERT_ID:
                  createNote();
                  return true;
          }
  
          return super.onMenuItemSelected(featureId, item);
      }
  
      @Override
      public void onCreateContextMenu(ContextMenu menu, View v,
              ContextMenuInfo menuInfo) {
          super.onCreateContextMenu(menu, v, menuInfo);
          menu.add(0, DELETE_ID, 0, R.string.menu_delete);
      }
  
      @Override
      public boolean onContextItemSelected(MenuItem item) {
          switch(item.getItemId()) {
              case DELETE_ID:
                  AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
                  mDbHelper.deleteNote(info.id);
                  fillData();
                  return true;
          }
          return super.onContextItemSelected(item);
      }
  
      private void createNote()
      {
             Context context = Notepadv2.this;
             AlertDialog.Builder alert = new AlertDialog.Builder(context);
  
              alert.setTitle("Add note");
              alert.setMessage("Enter text here");
  
               // Set an EditText view to get user input   
                final EditText input = new EditText(this); 
                alert.setView(input);
  
                alert.setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
  
                        Bundle bundle = new Bundle();
  
                        bundle.putString(NotesDbAdapter.KEY_TITLE, mTitleText.getText().toString());
                        bundle.putString(NotesDbAdapter.KEY_BODY, mBodyText.getText().toString());
                        if (mRowId != null) {
                            bundle.putLong(NotesDbAdapter.KEY_ROWID, mRowId);
                        }
  
                        Intent mIntent = new Intent();
                        mIntent.putExtras(bundle);
                        setResult(RESULT_OK, mIntent);
                    }
  
                });
  
                alert.setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
  
                        /* User clicked Cancel so do some stuff */
                    }
                });
  
              alert.create();
              alert.show();
      }
  
  
      @Override
      protected void onListItemClick(ListView l, View v, int position, long id) {
          super.onListItemClick(l, v, position, id);
          Cursor c = mNotesCursor;
          c.moveToPosition(position);
          Bundle bundle = new Bundle();
  
          bundle.putString(NotesDbAdapter.KEY_TITLE, mTitleText.getText().toString());
          bundle.putString(NotesDbAdapter.KEY_BODY, mBodyText.getText().toString());
          if (mRowId != null) {
              bundle.putLong(NotesDbAdapter.KEY_ROWID, mRowId);
          }
  
          Intent mIntent = new Intent();
          mIntent.putExtras(bundle);
          setResult(RESULT_OK, mIntent);
      }
  
      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
          super.onActivityResult(requestCode, resultCode, intent);
          Bundle extras = intent.getExtras();
          switch(requestCode) {
              case ACTIVITY_CREATE:
                  String title = extras.getString(NotesDbAdapter.KEY_TITLE);
                  String body = extras.getString(NotesDbAdapter.KEY_BODY);
                  mDbHelper.createNote(title, body);
                  fillData();
                  break;
              case ACTIVITY_EDIT:
                  Long rowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
                  if (rowId != null) {
                      String editTitle = extras.getString(NotesDbAdapter.KEY_TITLE);
                      String editBody = extras.getString(NotesDbAdapter.KEY_BODY);
                      mDbHelper.updateNote(rowId, editTitle, editBody);
                  }
                  fillData();
                  break;
          }
      }
  }
  </code></pre>
  
  <p><strong>NotesDbAdapter.java</strong></p>
  
  <pre><code>public class NotesDbAdapter {
  
      public static final String KEY_TITLE = "title";
      public static final String KEY_BODY = "body";
      public static final String KEY_ROWID = "_id";
  
      private static final String TAG = "NotesDbAdapter";
      private DatabaseHelper mDbHelper;
      private SQLiteDatabase mDb;
  
      /**
       * Database creation sql statement
       */
      private static final String DATABASE_CREATE =
          "create table notes (_id integer primary key autoincrement, "
          + "title text not null, body text not null);";
  
      private static final String DATABASE_NAME = "data";
      private static final String DATABASE_TABLE = "notes";
      private static final int DATABASE_VERSION = 2;
  
      private final Context mCtx;
  
      private static class DatabaseHelper extends SQLiteOpenHelper {
  
          DatabaseHelper(Context context) {
              super(context, DATABASE_NAME, null, DATABASE_VERSION);
          }
  
          @Override
          public void onCreate(SQLiteDatabase db) {
  
              db.execSQL(DATABASE_CREATE);
          }
  
          @Override
          public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
              Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                      + newVersion + ", which will destroy all old data");
              db.execSQL("DROP TABLE IF EXISTS notes");
              onCreate(db);
          }
      }
  
      /**
       * Constructor - takes the context to allow the database to be
       * opened/created
       * 
       * @param ctx the Context within which to work
       */
      public NotesDbAdapter(Context ctx) {
          this.mCtx = ctx;
      }
  
      /**
       * Open the notes database. If it cannot be opened, try to create a new
       * instance of the database. If it cannot be created, throw an exception to
       * signal the failure
       * 
       * @return this (self reference, allowing this to be chained in an
       *         initialization call)
       * @throws SQLException if the database could be neither opened or created
       */
      public NotesDbAdapter open() throws SQLException {
          mDbHelper = new DatabaseHelper(mCtx);
          mDb = mDbHelper.getWritableDatabase();
          return this;
      }
  
      public void close() {
          mDbHelper.close();
      }
  
  
      /**
       * Create a new note using the title and body provided. If the note is
       * successfully created return the new rowId for that note, otherwise return
       * a -1 to indicate failure.
       * 
       * @param title the title of the note
       * @param body the body of the note
       * @return rowId or -1 if failed
       */
      public long createNote(String title, String body) {
          ContentValues initialValues = new ContentValues();
          initialValues.put(KEY_TITLE, title);
          initialValues.put(KEY_BODY, body);
  
          return mDb.insert(DATABASE_TABLE, null, initialValues);
      }
  
      /**
       * Delete the note with the given rowId
       * 
       * @param rowId id of note to delete
       * @return true if deleted, false otherwise
       */
      public boolean deleteNote(long rowId) {
  
          return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) &gt; 0;
      }
  
      /**
       * Return a Cursor over the list of all notes in the database
       * 
       * @return Cursor over all notes
       */
      public Cursor fetchAllNotes() {
  
          return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE,
                  KEY_BODY}, null, null, null, null, null);
      }
  
      /**
       * Return a Cursor positioned at the note that matches the given rowId
       * 
       * @param rowId id of note to retrieve
       * @return Cursor positioned to matching note, if found
       * @throws SQLException if note could not be found/retrieved
       */
      public Cursor fetchNote(long rowId) throws SQLException {
  
          Cursor mCursor =
  
              mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
                      KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null,
                      null, null, null, null);
          if (mCursor != null) {
              mCursor.moveToFirst();
          }
          return mCursor;
  
      }
  
      /**
       * Update the note using the details provided. The note to be updated is
       * specified using the rowId, and it is altered to use the title and body
       * values passed in
       * 
       * @param rowId id of note to update
       * @param title value to set note title to
       * @param body value to set note body to
       * @return true if the note was successfully updated, false otherwise
       */
      public boolean updateNote(long rowId, String title, String body) {
          ContentValues args = new ContentValues();
          args.put(KEY_TITLE, title);
          args.put(KEY_BODY, body);
  
          return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) &gt; 0;
      }
  }
  </code></pre>
  
  <p><strong>notes_row.xml</strong></p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;TextView android:id="@+id/text1" xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:padding="12dp"/&gt;
  </code></pre>
  
  <p><strong>notes_list.xml</strong></p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
          android:layout_height="wrap_content"&gt;
  
      &lt;ListView android:id="@+id/android:list"
            android:layout_width="wrap_content"
              android:layout_height="wrap_content"/&gt;
      &lt;TextView android:id="@+id/android:empty"
            android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="@string/no_notes"/&gt;
  &lt;/LinearLayout&gt;
  </code></pre>
  
  <p>Does anyone have any sample code I could replace with what I have above to stop this error from happening? Thanks!</p>