Goldinegg
Goldinegg

Reputation: 23

NullPointerException while trying to populate a list in a fragment

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

Answers (2)

Ravi K Thapliyal
Ravi K Thapliyal

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:

Fragment Lifecycle


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 TextViews 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

Neeraj Jain
Neeraj Jain

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

Related Questions