Kevin
Kevin

Reputation: 23634

Activity is null when passing it to my Custom Adapter class

Acvitity is null when i am passing to my Custom Adapter. This happens when i change the orientation either from portrait to landscape or vice-versa.

I debugged, but could not figure out on why the Activity passed to my Adapter class is null.

Bellow is complete Fragment Class.

public class FragmentClass extends SherlockListFragment implements AsyncListner {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        AsyncTaskClass task = new AsyncTaskClass (Object, getSherlockActivity());
        task.setListener(this);
        task.execute();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.documents, container, false);
    }

    @Override
    public void onLoadComplete(List < Response > data) {
        AdapterClass adapter = new AdapterClass (getSherlockActivity(),
            android.R.id.list, data);
        setListAdapter(adapter);
    }

}

Below is the Log:

>     E / AndroidRuntime(1142): FATAL EXCEPTION: main E / AndroidRuntime(1142): java.lang.NullPointerException E /
> AndroidRuntime(1142): at
> android.widget.ArrayAdapter.init(ArrayAdapter.java: 310) E /
> AndroidRuntime(1142): at android.widget.ArrayAdapter. < init >
> (ArrayAdapter.java: 153) E / AndroidRuntime(1142): at
> com.example.test.DocumentsAdapter. < init > (DocumentsAdapter.java:
> 22) E / AndroidRuntime(1142): at
> com.example.test.DocumentsFragment.onLoadComplete(DocumentsFragment.java:
> 121) E / AndroidRuntime(1142): at
> com.example.test.DocumentsAsyncTask.onPostExecute(DocumentsAsyncTask.java:
> 101) E / AndroidRuntime(1142): at
> com.example.test.DocumentsAsyncTask.onPostExecute(DocumentsAsyncTask.java:
> 1) E / AndroidRuntime(1142): at
> android.os.AsyncTask.finish(AsyncTask.java: 631) E /
> AndroidRuntime(1142): at
> android.os.AsyncTask.access$600(AsyncTask.java: 177) E /
> AndroidRuntime(1142): at
> android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:
> 644) E / AndroidRuntime(1142): at
> android.os.Handler.dispatchMessage(Handler.java: 99) E /
> AndroidRuntime(1142): at android.os.Looper.loop(Looper.java: 137) E /
> AndroidRuntime(1142): at
> android.app.ActivityThread.main(ActivityThread.java: 4745) E /
> AndroidRuntime(1142): at java.lang.reflect.Method.invokeNative(Native
> Method) E / AndroidRuntime(1142): at
> java.lang.reflect.Method.invoke(Method.java: 511) E /
> AndroidRuntime(1142): at
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:
> 786) E / AndroidRuntime(1142): at
> com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 553) E /
> AndroidRuntime(1142): at dalvik.system.NativeStart.main(Native Method)

DocumentsAdapter adapter = new DocumentsAdapter(getSherlockActivity(), android.R.id.list, data);

I am getting getSherlockActivity() = null when passing it as argument to my Adapter class.

Upvotes: 0

Views: 362

Answers (1)

Michael
Michael

Reputation: 54705

When a fragment is detached from an activity, it sets its activity reference to null. So you should either save a reference to the activity in fragment's onAttach() method:

private SherlockActivity mActivity;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    mActivity = getSherlockActivity();
}

@Override
public void onLoadComplete(List<DocumentResponse> data) {
    DocumentsAdapter adapter =
            new DocumentsAdapter(mActivity, android.R.id.list, data);
    setListAdapter(adapter);
}

or check if the activity is not null before actually accessing it:

@Override
public void onLoadComplete(List<DocumentResponse> data) {
    SherlockActivity activity = getSherlockActivity();
    if (activity != null) {
        DocumentsAdapter adapter =
                new DocumentsAdapter(activity, android.R.id.list, data);
        setListAdapter(adapter);
    }
}

Upvotes: 5

Related Questions