Why is my “Notes” tab crashing?

I've tried searching for an answer but I'm relatively new to this area of programming and using Android Studio. Firstly, this is the error that I'm receiving when the emulator crashes. Bear with me as theres a lot of code and this is my first time posting.

--------- beginning of crash
08-16 16:59:46.930    1861-1861/com.example.richard.stopandsearch E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.richard.stopandsearch, PID: 1861
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
            at com.example.richard.stopandsearch.MainActivity$NotesListAdapter.getView(MainActivity.java:157)
            at android.widget.AbsListView.obtainView(AbsListView.java:2347)
            at android.widget.ListView.measureHeightOfChildren(ListView.java:1270)
            at android.widget.ListView.onMeasure(ListView.java:1182)
            at android.view.View.measure(View.java:17547)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
            at android.view.View.measure(View.java:17547)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
            at android.view.View.measure(View.java:17547)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
            at android.view.View.measure(View.java:17547)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
            at android.view.View.measure(View.java:17547)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
            at android.view.View.measure(View.java:17547)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
            at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:124)
            at android.view.View.measure(View.java:17547)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
            at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:444)
            at android.view.View.measure(View.java:17547)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
            at android.view.View.measure(View.java:17547)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
            at android.view.View.measure(View.java:17547)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2615)
            at android.view.View.measure(View.java:17547)
            at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2015)
            at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1173)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1379)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
            at android.view.Choreographer.doCallbacks(Choreographer.java:580)
            at android.view.Choreographer.doFrame(Choreographer.java:550)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.Activ

MainActivity.Java

package com.example.richard.stopandsearch;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TabHost;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    EditText LocationTxt, TimeTxt, DateTxt, OfficerTxt, DetailsTxt;
    List<Notes> Notes = new ArrayList<Notes>();
    ListView notesListView;
    databaseHandler dbHandler;



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

        LocationTxt = (EditText) findViewById(R.id.txtLocation);
        TimeTxt = (EditText) findViewById(R.id.txtTime);
        DateTxt = (EditText) findViewById(R.id.txtDate);
        OfficerTxt = (EditText) findViewById(R.id.txtOfficer);
        DetailsTxt = (EditText) findViewById(R.id.txtDetails);
        notesListView = (ListView) findViewById(R.id.listView);
        dbHandler = new databaseHandler(getApplicationContext());
        TabHost tabHost = (TabHost) findViewById(R.id.tabHost);

        tabHost.setup();

        TabHost.TabSpec tabSpec = tabHost.newTabSpec("addNote");
        tabSpec.setContent(R.id.tabAddNote);
        tabSpec.setIndicator("AddNote");
        tabHost.addTab(tabSpec);

        tabSpec = tabHost.newTabSpec("notes");
        tabSpec.setContent(R.id.tabNotes);
        tabSpec.setIndicator("Notes");
        tabHost.addTab(tabSpec);

        tabSpec = tabHost.newTabSpec("info");
        tabSpec.setContent(R.id.tabInfo);
        tabSpec.setIndicator("Info");
        tabHost.addTab(tabSpec);

        final Button addBtn = (Button) findViewById(R.id.btnAdd);
        addBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Notes notes = new Notes(dbHandler.getNotesCount(), String.valueOf(LocationTxt.getText()), String.valueOf(TimeTxt.getText()), String.valueOf(DateTxt.getText()), String.valueOf(OfficerTxt.getText()), String.valueOf(DetailsTxt.getText()));
              if (!noteExists(notes)) {
                  // Notes.add (new Notes(0, LocationTxt.getText().toString(), TimeTxt.getText().toString(), DateTxt.getText().toString(), OfficerTxt.getText().toString(), DetailsTxt.getText().toString()));
                  dbHandler.createNote(notes);
                  Notes.add(notes);

                  // populateList();
                  Toast.makeText(getApplicationContext(), "Your note has been added.", Toast.LENGTH_SHORT).show();
                  return;
              }
                Toast.makeText(getApplicationContext(), String.valueOf(LocationTxt.getText()) + " already exists. Please enter a different location.", Toast.LENGTH_SHORT).show();
            }
        });

        DetailsTxt.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                addBtn.setEnabled(String.valueOf(DetailsTxt.getText()).trim().length() >0);

           // @Override
          //  public void afterTextChanged(Editable s) {

            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

       // List<Notes> addableNotes = dbHandler.getAllNotes();
       // int noteCount = dbHandler.getNotesCount();

       // for (int i=0; i < noteCount; i++) {
       //     Notes.add(addableNotes.get(i));
       // }
        if (dbHandler.getNotesCount()!=0)
        Notes.addAll(dbHandler.getAllNotes());

       // if (!addableNotes.isEmpty())
            populateList();
    }

    private boolean noteExists(Notes notes) {
        String location = notes.getLocation();
        int notesCount = Notes.size();

        for (int i=0; i < notesCount; i++) {
            if(location.compareToIgnoreCase(Notes.get(i).getLocation()) ==0)
                return true;
        }
        return false;
    }

    private void populateList() {
        ArrayAdapter<Notes> adapter = new NotesListAdapter();
        notesListView.setAdapter(adapter);
    }


   // private void addNotes(String location, String time, String date, String officer, String details) {
        //Notes.add(new Notes(location, time, date, officer, details));

  //  }

    public class NotesListAdapter extends ArrayAdapter<Notes> {
        public NotesListAdapter() {

            super(MainActivity.this, R.layout.listviewitem, Notes);
        }

    @Override
    public View getView(int position, View view, ViewGroup parent) {
        if (view == null)
            view = getLayoutInflater().inflate(R.layout.listviewitem, parent, false);

        Notes currentNote = Notes.get(position);

        TextView location = (TextView) view.findViewById(R.id.txtLocationView);
        location.setText(currentNote.getLocation());
        TextView time = (TextView) view.findViewById(R.id.txtTimeView);
        time.setText (currentNote.getLocation());
        TextView date = (TextView) view.findViewById(R.id.txtDateView);
        date.setText (currentNote.getLocation());
        TextView officer = (TextView) view.findViewById(R.id.txtOfficer);
        officer.setText(currentNote.getLocation());
        TextView details = (TextView) view.findViewById(R.id.txtDetailsView);
        details.setText(currentNote.getLocation());

        return view;
    }

}

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

databaseHandler.java

package com.example.richard.stopandsearch;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.ArrayList;
import java.util.List;

public class databaseHandler extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "notes",
    TABLE_NOTES = "notes",
    KEY_ID = "id",
    KEY_LOCATION = "location",
    KEY_TIME = "time",
    KEY_DATE = "date",
    KEY_OFFICER = "officer",
    KEY_DETAILS = "details";

    public databaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + TABLE_NOTES + "(" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_LOCATION + " TEXT, " + KEY_TIME + " TEXT, " + KEY_DATE + " TEXT, " + KEY_OFFICER + " TEXT, " + KEY_DETAILS + " TEXT)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NOTES);
        onCreate(db);
    }

    public void createNote(Notes notes) {
        SQLiteDatabase db = getWritableDatabase();

        ContentValues values = new ContentValues();

        values.put(KEY_LOCATION, notes.getLocation());
        values.put(KEY_TIME, notes.getTime());
        values.put(KEY_DATE, notes.getDate());
        values.put(KEY_OFFICER, notes.getOfficer());
        values.put(KEY_DETAILS, notes.getDetails());

        db.insert(TABLE_NOTES, null, values);
        db.close();
    }

    public Notes getNotes(int id) {
        SQLiteDatabase db = getReadableDatabase();

        Cursor cursor = db.query(TABLE_NOTES, new String[] { KEY_ID, KEY_LOCATION, KEY_TIME, KEY_DATE, KEY_OFFICER, KEY_DETAILS }, KEY_ID + "=?", new String [] {String.valueOf(id) }, null, null, null, null);
        if (cursor != null)
            cursor.moveToFirst();
        assert cursor != null;
        Notes notes = new Notes(Integer.parseInt(cursor.getString(0)),cursor.getString(1),cursor.getString(2),cursor.getString(3), cursor.getString(4), cursor.getString(5));
        db.close();
        cursor.close();
        return notes;
    }


    public void deleteNote(Notes notes) {
        SQLiteDatabase db = getWritableDatabase();
        db.delete(TABLE_NOTES, KEY_ID + "=?", new String[] {String.valueOf(notes.getId())});
        db.close();
    }

    public int getNotesCount () {
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NOTES, null);
        int count = cursor.getCount();
        cursor.close();
        db.close();

        return count;
    }

    public int updateNotes(Notes notes) {
        SQLiteDatabase db = getWritableDatabase();

        ContentValues values = new ContentValues();

        values.put(KEY_LOCATION, notes.getLocation());
        values.put(KEY_TIME, notes.getTime());
        values.put(KEY_DATE, notes.getDate());
        values.put(KEY_OFFICER, notes.getOfficer());
        values.put(KEY_DETAILS, notes.getDetails());

        int rowsAffected = db.update(TABLE_NOTES, values, KEY_ID + "=?", new String[]{String.valueOf(notes.getId())});
db.close();

        return rowsAffected;

    }


    public List<Notes> getAllNotes() {
        List<Notes> notes = new ArrayList<Notes>();

        SQLiteDatabase db = getWritableDatabase();
        Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NOTES, null);

        if (cursor.moveToFirst()) {

            do {
                notes.add(new Notes(Integer.parseInt(cursor.getString(0)),cursor.getString(1),cursor.getString(2),cursor.getString(3), cursor.getString(4), cursor.getString(5)));

            }
            while (cursor.moveToNext());
        }
        cursor.close();
        db.close();
        return notes;
    }

}

Notes.Java

package com.example.richard.stopandsearch;

public class Notes {

    private String _location, _time, _date, _officer, _details;
    private int _id;

    public Notes (int id, String location, String time, String date, String officer, String details) {
        _id = id;
        _location = location;
        _time = time;
        _date = date;
        _officer = officer;
        _details = details;
    }

    public int getId() {return _id; }
    public String getLocation() {
        return _location;
    }
    public String getTime() {
        return _time;
    }
    public String getDate() {
        return _date;
    }
    public String getOfficer() {
        return _officer;
    }
    public String getDetails() {
        return _details;
    }


}

Activity_Main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical"
    android:background="#f9f9f9">

    <TabHost
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tabHost">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"></TabWidget>

            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <LinearLayout
                    android:id="@+id/tabInfo"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:orientation="vertical">

                    <ImageView
                        android:layout_width="fill_parent"
                        android:layout_height="wrap_content"
                        android:id="@+id/imgLogo3"
                        android:layout_gravity="center_horizontal"
                        android:src="@drawable/policelogo" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textAppearance="?android:attr/textAppearanceLarge"
                        android:text="Information"
                        android:id="@+id/txtInfo"
                        android:textColor="#1b0f3e"
                        android:layout_gravity="center_horizontal"
                        android:layout_marginTop="16dp" />
                </LinearLayout>

                <LinearLayout
                    android:id="@+id/tabNotes"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:orientation="vertical">

                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:id="@+id/imgLogo"
                        android:layout_gravity="center_horizontal"
                        android:src="@drawable/policelogo" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textAppearance="?android:attr/textAppearanceLarge"
                        android:text="Notes"
                        android:id="@+id/txtNotes"
                        android:layout_marginTop="16dp"
                        android:layout_gravity="center_horizontal"
                        android:singleLine="false"
                        android:textColor="#1b0f3e" />

                    <ListView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:id="@+id/listView"
                        android:layout_gravity="center_horizontal" />
                </LinearLayout>

                <LinearLayout
                    android:id="@+id/tabAddNote"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:orientation="vertical">

                    <ImageView
                        android:layout_width="fill_parent"
                        android:layout_height="wrap_content"
                        android:id="@+id/imgLogo2"
                        android:layout_gravity="center_horizontal"
                        android:src="@drawable/policelogo" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textAppearance="?android:attr/textAppearanceLarge"
                        android:text="Add Note"
                        android:id="@+id/lblNotesTitle"
                        android:layout_gravity="center_horizontal"
                        android:layout_marginTop="10dp"
                        android:textColor="#1b0f3e" />

                    <EditText
                        android:layout_width="fill_parent"
                        android:layout_height="wrap_content"
                        android:inputType="textPersonName"
                        android:ems="10"
                        android:id="@+id/txtLocation"
                        android:layout_marginTop="16dp"
                        android:hint="Location"
                        android:textColor="#1b0f3e" />

                    <EditText
                        android:layout_width="fill_parent"
                        android:layout_height="wrap_content"
                        android:inputType="time"
                        android:ems="10"
                        android:id="@+id/txtTime"
                        android:hint="Time"
                        android:layout_marginTop="16dp"
                        android:textColor="#1b0f3e" />

                    <EditText
                        android:layout_width="fill_parent"
                        android:layout_height="wrap_content"
                        android:inputType="date"
                        android:ems="10"
                        android:id="@+id/txtDate"
                        android:hint="Date"
                        android:layout_marginTop="16dp"
                        android:textColor="#1b0f3e" />

                    <EditText
                        android:layout_width="fill_parent"
                        android:layout_height="wrap_content"
                        android:id="@+id/txtOfficer"
                        android:hint="Officer name/number"
                        android:layout_marginTop="16dp"
                        android:textColor="#1b0f3e" />

                    <EditText
                        android:layout_width="fill_parent"
                        android:layout_height="wrap_content"
                        android:id="@+id/txtDetails"
                        android:hint="Event details"
                        android:layout_marginTop="16dp"
                        android:lines="4"
                        android:textColor="#1b0f3e" />

                    <Button
                        android:layout_width="200dp"
                        android:layout_height="wrap_content"
                        android:text="Add Note"
                        android:id="@+id/btnAdd"
                        android:layout_gravity="center_horizontal"
                        android:layout_marginTop="16dp"
                        android:enabled="false"
                        android:textColor="#1b0f3e" />
                </LinearLayout>

            </FrameLayout>
        </LinearLayout>
    </TabHost>

</LinearLayout>

Again I apologise for the huge chunks of code, but I'm hoping there's something that may be obvious for somebody experienced that is eluding me. Thanks in advance.

Answers


Going off of your error log, it looks as if you are inflating listviewitem.xml in your getView() method, but the widgets (TextViews) you are referencing are in activity_main.xml.

Edit: Well, at least one is, with the id txtOfficer

In terms of a resolution, ensure all of the id attributes you assign in your xml layouts are unique, and ensure that you only use findViewById() to locate a widget that is contained inside the calling View:

view = getLayoutInflater().inflate(R.layout.listviewitem, parent, false);
view.findViewById(*id of a widget inside listviewitem.xml*)

The problem what @PPartisan pointed out is real, but also note that in your activity_main.xml you are referencing EditText elements as TextView elements in your java code.


Need Your Help

How do I populate a listbox with xaml using an xml document

c# xml wpf xaml

I am trying to populate a listbox using xaml. I think I have the binding correct. I'm just not sure why the info isn't populating. I've tried moving the binding for the xml file around.

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.