Reputation: 23
I've been trying to populate a ListView from a database within a fragment in Android. Unfortunately, when starting the app, I get NullPointerException
while it is trying to populate & create my list.
The code in which I am getting the NullPointerException
public class AlarmFrag extends Fragment {
List<UserInputAlarmData> UserInputAlarmData = new ArrayList<UserInputAlarmData>();
DatabaseHandler dbHandler;
ListView AlarmListView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.frag_alarm, container, false);
AlarmListView = (ListView)rootView.findViewById(R.id.AlarmListView);
return rootView;
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dbHandler = new DatabaseHandler(getActivity());
List<UserInputAlarmData> addableAlarmData = dbHandler.getAllAlarmData();
int AlarmDataCount = dbHandler.getAlarmDataCount();
for (int i = 0; i < AlarmDataCount; i++) {
UserInputAlarmData.add(addableAlarmData.get(i));
}
if (!addableAlarmData.isEmpty())
populateList();
}
private void populateList() {
ArrayAdapter<UserInputAlarmData> adapter = new AlarmListAdapter();
AlarmListView.setAdapter(adapter);
}
private void AddAlarm(int id, String name, String phone, String email, String address) {
UserInputAlarmData.add(new UserInputAlarmData(id, name, phone, email, address));
}
private class AlarmListAdapter extends ArrayAdapter<UserInputAlarmData> {
public AlarmListAdapter() {
super(getActivity(), R.layout.alarm_view_item, UserInputAlarmData);
}
}
}
The referenced frag_alarm.xml file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#363">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="AlarmScreen"
android:textSize="20dp"
android:layout_centerInParent="true"
android:id="@+id/textView" />
<Button
android:layout_width="wrap_content"
android:layout_height="100px"
android:text="Add New Alarm"
android:id="@+id/AlarmSetupButton"
android:onClick="AlarmSetupButtonClick"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<ListView
android:layout_width="0dp"
android:layout_height="100dp"
android:id="@+id/AlarmListView"
android:layout_gravity="center"/>
</RelativeLayout>
Referenced alarm_view_item.xml file.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="1">
<TextView
android:layout_width="128dp"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Alarm Title:"
android:id="@+id/TitleName"
android:layout_weight="0.03" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Time:"
android:id="@+id/TimeName" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Date:"
android:id="@+id/DateName" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Song:"
android:id="@+id/SongName" />
</LinearLayout>
Logcat providing crash report.
java.lang.NullPointerException
at com.goldin.foodtektrakr.AlarmFrag.populateList(AlarmFrag.java:49)
at com.goldin.foodtektrakr.AlarmFrag.onCreate(AlarmFrag.java:44)
at android.support.v4.app.Fragment.performCreate(Fragment.java:1763)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:913)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:486)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1073)
at android.support.v4.view.ViewPager.populate(ViewPager.java:919)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1441)
at android.view.View.measure(View.java:12752)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
at android.view.View.measure(View.java:12752)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:812)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
at android.view.View.measure(View.java:12752)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2267)
at android.view.View.measure(View.java:12752)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1074)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2462)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4532)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Thank you in advanced for the help. I can provide any other class or xml files which are needed to sort out the problem.
Upvotes: 0
Views: 54
Reputation: 51711
onCreateView()
method is called after onCreate()
. When you call your populateList()
method from onCreate()
, your AlarmListView
has not been initialized yet. So, simply move the call to onCreateView()
method to fix your issue.
The complete Fragment
lifecycle is as follows:
I am now getting another error unfortunately: ArrayAdapter requires the resource ID to be a TextView
Instantiate your AlarmListAdapter
as
private class AlarmListAdapter extends ArrayAdapter<UserInputAlarmData> {
public AlarmListAdapter() {
super(getActivity(),
R.layout.alarm_view_item,
R.id.TitleName, // Passing TextView id
UserInputAlarmData);
}
}
Although, this would get rid of the error but it wouldn't do quite what you're hoping for. I see that you have four TextView
s within your row item layout, but an ArrayAdapter
can bind text to only one of those. Since, we passed R.id.TitleName
there, the adpater will bind the text to the first TextView
only.
To split your adpater item and display data in multiple views that make the list item, you would need to extend the ArrayAdapter
class and implement getView()
. Here's one of the many tutorials available online that show how to implement one: ListView with Custom Adpater.
Upvotes: 2
Reputation: 7730
You haven't initialized your ListView AlarmListView;
So default value of any reference variable is null
that is why you are getting Null Pointer Exception
So when you call this line
AlarmListView.setAdapter(adapter);
it is actually
null.setAdapter(adapter);
/\
||
So Null Pointer Exception
Upvotes: 0