Search code examples
androidandroid-listviewandroid-arrayadapterandroid-xmlandroid-dialogfragment

NullPointerException on a listView.setAdapter() method


So i got this problem. and i know why. But first code so you will know why too :).

LoveMailsActivity.java:

package com.example.ex;

import android.app.DialogFragment;
import android.app.FragmentManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class LoveMailsActivity extends AppCompatActivity
{
FragmentManager fragmentManager;
CustomDialogFragment CustomDialogFragment;

//CustomArrayAdapter customArrayAdapter;
ArrayAdapter<String> arrayAdapter;
ListView dialogListView;

TextView loveEmailOpeningWordsHeaderTextView;

String[] items = {"Hello","Hello there","Hi","Hi there"};

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

    viewsInitialization();

    fragmentManager = getFragmentManager();
    CustomDialogFragment = new CustomDialogFragment();

    //customArrayAdapter = new CustomArrayAdapter(LoveMailsActivity.this, items);
    arrayAdapter = new ArrayAdapter<String>(LoveMailsActivity.this, R.layout.list_view_row,R.id.row_text_view_id,items);
    dialogListView.setAdapter(arrayAdapter); // NullPointerExeption

    loveEmailOpeningWordsHeaderTextView.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v) 
        {
            CustomDialogFragment.show(fragmentManager, "Opening words");
        }
    });
} // End of onCreate() method

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

@Override
public boolean onOptionsItemSelected(MenuItem item) 
{
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) 
    {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

private void viewsInitialization()
{
    loveEmailOpeningWordsHeaderTextView = (TextView) findViewById(R.id.love_email_opening_words_header_text_view_id);
    dialogListView = (ListView) findViewById(R.id.dialog_list_view_id);
}

public class CustomDialogFragment extends DialogFragment
{
    TextView listViewItemTextView;
    ArrayAdapter<String> arrayAdapter;
    ListView dialogListView;
    String[] items = {"Hello","Hello there","Hi","Hi there"};

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
    {
        View rootView = inflater.inflate(R.layout.dialog, container,false);

        getDialog().setTitle("Choose an option"); // Set dialog title

        listViewItemTextView = (TextView) rootView.findViewById(R.id.list_view_item_text_view_id);
        dialogListView = (ListView) rootView.findViewById(R.id.dialog_list_view_id);

        getDialog().setTitle("Opening Words"); // Setting dialog title

        /*
        CustomArrayAdapter customArrayAdapter = new CustomArrayAdapter(getActivity(), items);
        dialogListView.setAdapter(customArrayAdapter);
        */
        dialogListView.setOnItemClickListener(new OnItemClickListener() 
        {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,int position, long id)
            {
                Toast.makeText(getActivity(), items[position], Toast.LENGTH_SHORT).show();
            }
        });

        return rootView;
    }
}

}

activity_love_mails.xml:

<RelativeLayout 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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.predesignedmails.LoveMailsActivity" >

<TextView
    android:id="@+id/love_email_emai_to_send_to_text_view_id"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/emai_to_send_to_text_view_text"
    android:textSize="16sp"
    android:textStyle="bold"
    android:textColor="@color/opening_words_list_view_header_color"
    />

<EditText
    android:id="@+id/love_email_email_to_send_to_edit_text_id"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/emai_to_send_to_edit_text_hint"
    android:inputType="textEmailAddress"
    android:textSize="18sp"
    android:textColor="@color/selection_text_color"
    android:layout_below="@id/love_email_emai_to_send_to_text_view_id"
    />

<TextView
    android:id="@+id/love_email_opening_words_header_text_view_id"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/love_email_opening_words_text_view_text"
    android:textSize="16sp"
    android:textStyle="bold"
    android:textColor="@color/opening_words_list_view_header_color"
    android:layout_below="@id/love_email_email_to_send_to_edit_text_id"
    />

<TextView
    android:id="@+id/love_email_opening_words_text_view_id"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/initial_text"
    android:textSize="18sp"
    android:textColor="@color/selection_text_color"
    android:layout_below="@id/love_email_opening_words_header_text_view_id"
    />


</RelativeLayout>

Now i get the obvious NullPointerException on the dialogListView.setAdapter(arrayAdapter); // NullPointerExeption line because i dont have any ListView named dialog_list_view_id in the activity_love_mails.xml. I have that kind of ListView in another XML file:

dialog.xml:

<?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" >

<ListView 
    android:id="@+id/dialog_list_view_id"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />


</RelativeLayout>

Now what am i doing wrong? My way of implementing this is obviously wrong and can't figure out what? The CustomDialogFragment class? the ArrayAdapter?

EDIT

LogCat:

09-02 19:47:08.208: E/AndroidRuntime(21574): FATAL EXCEPTION: main
09-02 19:47:08.208: E/AndroidRuntime(21574): Process: com.example.predesignedmails, PID: 21574
09-02 19:47:08.208: E/AndroidRuntime(21574): java.lang.RuntimeException: Unable to start activity   ComponentInfo{com.example.predesignedmails/com.example.predesignedmails.LoveM    ailsActivity}: java.lang.NullPointerException: Attempt to invoke virtual     method 'void  android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null  object reference
09-02 19:47:08.208: E/AndroidRuntime(21574):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305)
09-02 19:47:08.208: E/AndroidRuntime(21574):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2367)
09-02 19:47:08.208: E/AndroidRuntime(21574):    at android.app.ActivityThread.access$800(ActivityThread.java:148)
09-02 19:47:08.208: E/AndroidRuntime(21574):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283)
09-02 19:47:08.208: E/AndroidRuntime(21574):    at android.os.Handler.dispatchMessage(Handler.java:102)
09-02 19:47:08.208: E/AndroidRuntime(21574):    at android.os.Looper.loop(Looper.java:135)
09-02 19:47:08.208: E/AndroidRuntime(21574):    at android.app.ActivityThread.main(ActivityThread.java:5274)
09-02 19:47:08.208: E/AndroidRuntime(21574):    at java.lang.reflect.Method.invoke(Native Method)
09-02 19:47:08.208: E/AndroidRuntime(21574):    at java.lang.reflect.Method.invoke(Method.java:372)
09-02 19:47:08.208: E/AndroidRuntime(21574):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:90    09-02 19:47:08.208: E/AndroidRuntime(21574):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)
09-02 19:47:08.208: E/AndroidRuntime(21574): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
09-02 19:47:08.208: E/AndroidRuntime(21574):    at com.example.predesignedmails.LoveMailsActivity.onCreate(LoveMailsActivity.java:45)
09-02 19:47:08.208: E/AndroidRuntime(21574):    at android.app.Activity.performCreate(Activity.java:5977)
09-02 19:47:08.208: E/AndroidRuntime(21574):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
09-02 19:47:08.208: E/AndroidRuntime(21574):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2258)
09-02 19:47:08.208: E/AndroidRuntime(21574):    ... 10 more

Solution

  • Your listview is in the dialog fragment and you are trying to call findViewById in the activity, hence it cannot be found and is therefore null.

    Set your adapter to the listview within the dialog fragment in the onCreateView method.

    Cheers :)