I am using an ArrayAdapter to display data held in an array via a ListView, my code compiles fine but when I call the class below is causes the process to end with the Sorry application has stopped exception.
public class Timetable extends Activity {
private ListView timeTableView;
private ArrayList <Module> Modules;
private ArrayAdapter <Module> adaptModule;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view);
timeTableView = (ListView) findViewById(R.id.timeTableView);
adaptModule = new ArrayAdapter<Module>(this, android.R.layout.simple_list_item_1, Modules);
timeTableView.setAdapter(adaptModule);
}
}
Here is my Add class which deals with creating an array and adding items to the array:
public class Add extends Activity implements OnClickListener{
private EditText ModuleText;
private EditText RoomText;
private Spinner Day;
private Spinner Start;
private Spinner Duration;
private Spinner Session;
private ArrayList<Module> Modules;
/*
* OnCreate method for add class
* @see android.app.Activity#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add);
// spinner for days
Spinner day = (Spinner) findViewById(R.id.spinnerDay);
ArrayAdapter<CharSequence> adapterDay = ArrayAdapter.createFromResource(
this, R.array.days_array, android.R.layout.simple_spinner_item);
adapterDay.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
day.setAdapter(adapterDay);
// spinner for start time
Spinner startTime = (Spinner) findViewById(R.id.spinnerStart);
ArrayAdapter<CharSequence> adapterstart = ArrayAdapter.createFromResource(
this, R.array.start_array, android.R.layout.simple_spinner_item);
adapterstart.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
startTime.setAdapter(adapterstart);
// spinner for duration
Spinner duration = (Spinner) findViewById(R.id.spinnerDuration);
ArrayAdapter<CharSequence> adapterduration = ArrayAdapter.createFromResource(
this, R.array.duration_array, android.R.layout.simple_spinner_item);
adapterduration.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
duration.setAdapter(adapterduration);
// spinner for class type
Spinner session = (Spinner) findViewById(R.id.spinnerSession);
ArrayAdapter<CharSequence> adapterSession = ArrayAdapter.createFromResource(
this, R.array.session_array, android.R.layout.simple_spinner_item);
adapterSession.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
session.setAdapter(adapterSession);
//create array
Modules = new ArrayList<Module>();
// ref to UI Widgets
ModuleText = (EditText) findViewById(R.id.ModuleText);
RoomText = (EditText) findViewById(R.id.RoomText);
Day = (Spinner) findViewById(R.id.spinnerDay);
Start = (Spinner) findViewById(R.id.spinnerStart);
Duration = (Spinner) findViewById(R.id.spinnerDuration);
Session = (Spinner) findViewById(R.id.spinnerSession);
// buttons for this activity also includes listeners
View addEntryButton = findViewById(R.id.addEntry_button);
addEntryButton.setOnClickListener(this);
View cancelEntryButton = findViewById(R.id.cancelEntry_button);
cancelEntryButton.setOnClickListener(this);
}
/*
* on click listeners for buttons
* @see android.view.View.OnClickListener#onClick(android.view.View)
*/
public void onClick(View v) {
switch (v.getId()) {
case R.id.cancelEntry_button:
Intent i = new Intent(this, Home.class);
startActivity(i);
break;
}
switch (v.getId()) {
case R.id.addEntry_button:
Intent i = new Intent(this, Home.class);
addModule();
startActivity(i);
break;
}
}
/*
* Method for adding an entry into the table
*/
public void addModule()
{
if(ModuleText !=null || RoomText !=null)
{
Modules.add(new Module(ModuleText.getText().toString(), RoomText.getText().toString(), Day.getSelectedItem().toString(), Start.getSelectedItem().toString(), Duration.getSelectedItem().toString(), Session.getSelectedItem().toString()));
Toast.makeText(getApplicationContext(), "Timetable entry has been added succesfully", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(getApplicationContext(), "Error adding timetable entry, please check details and try again", Toast.LENGTH_SHORT).show();
}
}
}
Here is my logcat with the exception:
04-22 11:52:46.290: E/AndroidRuntime(426): FATAL EXCEPTION: main
04-22 11:52:46.290: E/AndroidRuntime(426): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.assignment.timetable/org.assignment.timetable.Timetable}: java.lang.NullPointerException
04-22 11:52:46.290: E/AndroidRuntime(426): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
04-22 11:52:46.290: E/AndroidRuntime(426): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
04-22 11:52:46.290: E/AndroidRuntime(426): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
04-22 11:52:46.290: E/AndroidRuntime(426): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
04-22 11:52:46.290: E/AndroidRuntime(426): at android.os.Handler.dispatchMessage(Handler.java:99)
04-22 11:52:46.290: E/AndroidRuntime(426): at android.os.Looper.loop(Looper.java:123)
04-22 11:52:46.290: E/AndroidRuntime(426): at android.app.ActivityThread.main(ActivityThread.java:4627)
04-22 11:52:46.290: E/AndroidRuntime(426): at java.lang.reflect.Method.invokeNative(Native Method)
04-22 11:52:46.290: E/AndroidRuntime(426): at java.lang.reflect.Method.invoke(Method.java:521)
04-22 11:52:46.290: E/AndroidRuntime(426): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-22 11:52:46.290: E/AndroidRuntime(426): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-22 11:52:46.290: E/AndroidRuntime(426): at dalvik.system.NativeStart.main(Native Method)
04-22 11:52:46.290: E/AndroidRuntime(426): Caused by: java.lang.NullPointerException
04-22 11:52:46.290: E/AndroidRuntime(426): at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:291)
04-22 11:52:46.290: E/AndroidRuntime(426): at android.widget.ListView.setAdapter(ListView.java:436)
04-22 11:52:46.290: E/AndroidRuntime(426): at org.assignment.timetable.Timetable.onCreate(Timetable.java:25)
04-22 11:52:46.290: E/AndroidRuntime(426): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-22 11:52:46.290: E/AndroidRuntime(426): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
You never initialize the
Modulesfield in yourTimetableclass and when you use it in theadaptModuleadapter it will throw theNullPointerExceptionthat you see. If you build theModuleslist in another activity and then you try display it in theTimetableactivity then you’ll have to pass theModuleslist from that activity(probably the theAddactivity) and use that list in the adapter.There are various ways on how to pass that
ArrayListfrom one activity to another activity, you can see more examples here on Stackoverflow, for example:Android: how to pass ArrayList<object> from an activity to another
Small example added:
The class that extends
Application:An activity where we add elements to the list of
Modules:The activity where we will show the list of
Modulespreviously created in theAddActivity:In order for our
MyApplicationto work we’ll have to register it in the manifest(see the application element, and the addedandroid:nametag):And finally the
Moduleclass: