NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference

157,801

Solution 1

You should initialize yours recordings. You are passing to adapter null

ArrayList<String> recordings = null; //You are passing this null

Solution 2

This issue is due to ArrayList variable not being instantiated. Need to declare "recordings" variable like following, that should solve the issue;

ArrayList<String> recordings = new ArrayList<String>();

this calls default constructor and assigns empty string to the recordings variable so that it is not null anymore.

Solution 3

Change

 mAdapter = new RecordingsListAdapter(this, recordings);

to

 mAdapter = new RecordingsListAdapter(getActivity(), recordings);

and also make sure that recordings!=null at mAdapter = new RecordingsListAdapter(this, recordings);

Share:
157,801
android enthusiast
Author by

android enthusiast

Updated on March 10, 2021

Comments

  • android enthusiast
    android enthusiast about 3 years

    I'm a newbie to Fragments and custom ListView adapters. Can anyone give me a hand please?

    I've got my Fragment where I have my ListView

    public class RecordingListFragment extends Fragment implements OnItemClickListener {
    
        ListView mListView;
        TextView emptyView;
        Button options, delete,edit;
        ArrayList<String> recordings = null;
        RecordingsListAdapter mAdapter;
    
        public RecordingListFragment() {
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.recording_list_fragment, container,false);
    
            options = (Button) rootView.findViewById(R.id.options);
            edit = (Button) rootView.findViewById(R.id.edit);
            delete = (Button) rootView.findViewById(R.id.delete);
            mListView = (ListView) rootView.findViewById(R.id.list);
            emptyView = (TextView) rootView.findViewById(R.id.empty);
    
    
            mAdapter = new RecordingsListAdapter(this, recordings);
            mListView.setAdapter(mAdapter);
            mListView.setEmptyView(emptyView);
            mListView.setOnItemClickListener(this);
    
            return rootView;
        }
    }
    

    and my xml for it

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:android1="http://schemas.android.com/apk/res/android"
        android:id="@+id/recording_list_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff"
        android:orientation="vertical">
    
        <RelativeLayout
            android:layout_height="50dp"
            android:layout_width="match_parent"
            android:orientation="horizontal"
            android:background="@drawable/title" >
    
            <TextView
                android1:id="@+id/title"
                android1:layout_width="wrap_content"
                android1:layout_height="50dp"
                android1:layout_alignParentTop="true"
                android1:layout_centerHorizontal="true"
                android1:layout_marginStart="80dp"
                android1:gravity="center"
                android1:text="@string/app_name"
                android1:textAlignment="center"
                android1:textColor="#000000"
                android1:textStyle="bold" />
    
        </RelativeLayout>
    
        <FrameLayout
            android:layout_height="wrap_content"
            android:layout_width="match_parent">
    
            <ListView
                android:id="@+id/list"
                android:animateLayoutChanges="true"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>
            <!--  android:divider="@null"--> 
    
            <TextView
                android:id="@+id/empty"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="center"
                android:text="@string/empty_list_text"
                android:paddingLeft="30dp"
                android:paddingRight="30dp"
                android:paddingTop="180dp" />
    
        </FrameLayout>
    </LinearLayout>
    

    and I've got my custom list item

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:orientation="horizontal" >
    
        <CheckedTextView
            android:id="@+id/textView"
            android:layout_width="fill_parent"
            android:layout_height="?android:attr/listPreferredItemHeight"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:gravity="center_vertical"
            android:checkMark="?android:attr/listChoiceIndicatorSingle"
            android:paddingLeft="6dip"
            android:paddingRight="6dip"
            android:textColor="#000000"
            /> 
    
    </LinearLayout>
    

    and finally, my Adapter

    public class RecordingsListAdapter  extends BaseAdapter {
        Context ctx;
        LayoutInflater lInflater;
        ArrayList<String> recordings;
    
        RecordingsListAdapter(Context context, ArrayList<String> products) {
            ctx = context;
            recordings = products;
            lInflater = (LayoutInflater) ctx
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
    
        public RecordingsListAdapter(RecordingListFragment recordingListFragment,
        ArrayList<String> recordings) {
            // TODO Auto-generated constructor stub
        }
    
    
        @Override
        public int getCount() {
            return recordings.size();
        }
    
    
        @Override
        public Object getItem(int position) {
            return recordings.get(position);
        }
    
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
    
            View view = convertView;
            if (view == null) {
                view = lInflater.inflate(R.layout.custom_list_item, parent, false);
            }
    
            return view;
        }
    } 
    

    and when I run this, I get this null pointer

    11-26 11:00:45.352: E/AndroidRuntime(10191): java.lang.RuntimeException: Unable to start activity ComponentInfo{d/recordings.RecordingsActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
    11-26 11:00:45.352: E/AndroidRuntime(10191):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
    11-26 11:00:45.352: E/AndroidRuntime(10191):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
    11-26 11:00:45.352: E/AndroidRuntime(10191):    at android.app.ActivityThread.access$800(ActivityThread.java:144)
    11-26 11:00:45.352: E/AndroidRuntime(10191):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
    11-26 11:00:45.352: E/AndroidRuntime(10191):    at android.os.Handler.dispatchMessage(Handler.java:102)
    11-26 11:00:45.352: E/AndroidRuntime(10191):    at android.os.Looper.loop(Looper.java:135)
    11-26 11:00:45.352: E/AndroidRuntime(10191):    at android.app.ActivityThread.main(ActivityThread.java:5221)
    11-26 11:00:45.352: E/AndroidRuntime(10191):    at java.lang.reflect.Method.invoke(Native Method)
    11-26 11:00:45.352: E/AndroidRuntime(10191):    at java.lang.reflect.Method.invoke(Method.java:372)
    11-26 11:00:45.352: E/AndroidRuntime(10191):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
    11-26 11:00:45.352: E/AndroidRuntime(10191):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
    11-26 11:00:45.352: E/AndroidRuntime(10191): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
    11-26 11:00:45.352: E/AndroidRuntime(10191):    at recordings.RecordingsListAdapter.getCount(RecordingsListAdapter.java:36)
    11-26 11:00:45.352: E/AndroidRuntime(10191):    at android.widget.ListView.setAdapter(ListView.java:487)
    11-26 11:00:45.352: E/AndroidRuntime(10191):    at recordings.RecordingListFragment.onCreateView(RecordingListFragment.java:47)
    11-26 11:00:45.352: E/AndroidRuntime(10191):    at android.app.Fragment.performCreateView(Fragment.java:2053)
    11-26 11:00:45.352: E/AndroidRuntime(10191):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:894)
    11-26 11:00:45.352: E/AndroidRuntime(10191):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
    11-26 11:00:45.352: E/AndroidRuntime(10191):    at android.app.BackStackRecord.run(BackStackRecord.java:833)
    11-26 11:00:45.352: E/AndroidRuntime(10191):    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452)
    11-26 11:00:45.352: E/AndroidRuntime(10191):    at android.app.Activity.performStart(Activity.java:5948)
    11-26 11:00:45.352: E/AndroidRuntime(10191):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)
    11-26 11:00:45.352: E/AndroidRuntime(10191):    ... 10 more
    

    Thank you in advance!!!

  • Selvin
    Selvin over 9 years
    he doesn't have compile time error so this is not a problem (he has in fact a different code ?)
  • android enthusiast
    android enthusiast over 9 years
    I added your change + I populated recordings with some static data and I get this error `11-26 11:21:47.125: E/AndroidRuntime(11596): java.lang.RuntimeException: Unable to start activity ComponentInfo{xxxxx/recordings.RecordingsActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.util.ArrayList.add(java.lang.Object)' on a null object reference
  • M D
    M D over 9 years
    @AdrianAntal add some records in your ArrayList like. recordings.add("ABC"); recordings.add("AXYZ"); and so on...
  • s.j
    s.j almost 5 years
    i declare variable as you did but still getting error
  • Tyler2P
    Tyler2P about 3 years
    Hi and welcome to Stack Overflow! Please take the tour. Thanks for answering but can you also add an explanation on how your code solves the issue? Check the help center for info on how to format code.