Question

I am using a custom list view inside a class that extends the "Fragment". This custom list view is set to open when one of the navigation drawer items is clicked. So the hierarchy is like this:

MainActivity.java (extends Activity)

  • MyList.java (extends Fragment)

The problem is, the program works absolutely fine when I DO NOT add the item click listener into the onCreateView() method. But, when I do, the log cat throws errors pointing to 2 locations - one at the XML below at part where the fragment tag is declared, and the other at the MyList.java where the item click listener has been defined.

I've commented on the exact locations where the logcat is pointing errors at in MyList.java and the XML file.

Why is this happening? I'm looking to have each list item clickable and perform some action on click.

The XML for MainActivity (using a drawer layout) -

   <android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- Logcat points error on the beginning of the fragment tag -->

    <fragment 
          class="com.example.test.MyList" 
          android:id="@+id/fragment1"
          android:layout_width="match_parent"
          android:layout_height="match_parent" />

    <!-- Logcat points error here at the beginning of the fragment tag -->


    <!-- Framelayout to display Fragments -->
    <FrameLayout
        android:id="@+id/frame_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!-- Listview to display slider menu -->
    <ListView
        android:id="@+id/list_slidermenu"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@color/list_divider"
        android:dividerHeight="1dp"        
        android:listSelector="@drawable/list_selector"
        android:background="@color/list_background"/>


</android.support.v4.widget.DrawerLayout> 

MyList.java:

import java.util.ArrayList;

import android.app.Fragment;
import android.content.Context;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class MyList extends Fragment {

    ListView list;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedinstanceState)
    {

       /* Log cat points here too, at the beginning of setOnItemClickListener */

        list.setOnItemClickListener(new OnItemClickListener(){

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {

                System.out.println("Works!");
            }
            });

    return inflater.inflate(R.layout.listview, container, false);

    }

    @Override
    public void onStart() {

        super.onStart();
        list=(ListView)getView().findViewById(R.id.listView1);
        list.setAdapter(new List1Adapter(getActivity()));
    }

}

    class List1Adapter extends BaseAdapter
    {
        ArrayList<SingleRow> list;
        Context context;
        List1Adapter(Context c)
        {
            context=c;
            list=new ArrayList<SingleRow>();

            Resources res=c.getResources();
            String[] title=res.getStringArray(R.array.titles);
            String[] description=res.getStringArray(R.array.descriptions);

            int[] images={R.drawable.img1,R.drawable.img2,R.drawable.img3,R.drawable.img4};
            for(int i=0;i<3;i++)
            {
                list.add(new SingleRow(title[i],description[i],images[i]));
            }
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return list.size();
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return list.get(position);
        }

        @Override
        public long getItemId(int position) {

            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View row=inflater.inflate(R.layout.list_rows, parent, false);
            TextView title=(TextView)row.findViewById(R.id.textView1);
            TextView description=(TextView)row.findViewById(R.id.textView2);
            ImageView image=(ImageView)row.findViewById(R.id.imageView1);

            SingleRow temp=list.get(position);

            title.setText(temp.title);
            description.setText(temp.description);
            image.setImageResource(temp.image);

            return row;
        }


    class SingleRow
    {
        String title;
        String description;
        int image;
        SingleRow(String title, String description, int image)
        {
            this.title=title;
            this.description=description;
            this.image=image;
        }
    }

    }

Logcat:

   02-14 10:25:14.248: E/ActivityThread(22106): Failed to inflate
    02-14 10:25:14.248: E/ActivityThread(22106): android.view.InflateException: Binary XML file line #7: Error inflating class fragment
    02-14 10:25:14.248: E/ActivityThread(22106):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713)
    02-14 10:25:14.248: E/ActivityThread(22106):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    02-14 10:25:14.248: E/ActivityThread(22106):    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    02-14 10:25:14.248: E/ActivityThread(22106):    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    02-14 10:25:14.248: E/ActivityThread(22106):    at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
    02-14 10:25:14.248: E/ActivityThread(22106):    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:320)
    02-14 10:25:14.248: E/ActivityThread(22106):    at android.app.Activity.setContentView(Activity.java:1895)
    02-14 10:25:14.248: E/ActivityThread(22106):    at com.example.test.MainActivity.onCreate(MainActivity.java:40)
    02-14 10:25:14.248: E/ActivityThread(22106):    at android.app.Activity.performCreate(Activity.java:5133)
    02-14 10:25:14.248: E/ActivityThread(22106):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    02-14 10:25:14.248: E/ActivityThread(22106):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2293)
    02-14 10:25:14.248: E/ActivityThread(22106):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389)
    02-14 10:25:14.248: E/ActivityThread(22106):    at android.app.ActivityThread.access$600(ActivityThread.java:153)
    02-14 10:25:14.248: E/ActivityThread(22106):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269)
    02-14 10:25:14.248: E/ActivityThread(22106):    at android.os.Handler.dispatchMessage(Handler.java:99)
    02-14 10:25:14.248: E/ActivityThread(22106):    at android.os.Looper.loop(Looper.java:137)
    02-14 10:25:14.248: E/ActivityThread(22106):    at android.app.ActivityThread.main(ActivityThread.java:5289)
    02-14 10:25:14.248: E/ActivityThread(22106):    at java.lang.reflect.Method.invokeNative(Native Method)
    02-14 10:25:14.248: E/ActivityThread(22106):    at java.lang.reflect.Method.invoke(Method.java:525)
    02-14 10:25:14.248: E/ActivityThread(22106):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
    02-14 10:25:14.248: E/ActivityThread(22106):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
    02-14 10:25:14.248: E/ActivityThread(22106):    at dalvik.system.NativeStart.main(Native Method)
    02-14 10:25:14.248: E/ActivityThread(22106): Caused by: java.lang.NullPointerException
    02-14 10:25:14.248: E/ActivityThread(22106):    at com.example.test.List.onCreateView(MyList.java:27)
    02-14 10:25:14.248: E/ActivityThread(22106):    at android.app.Fragment.performCreateView(Fragment.java:1695)
    02-14 10:25:14.248: E/ActivityThread(22106):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:861)
    02-14 10:25:14.248: E/ActivityThread(22106):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035)
    02-14 10:25:14.248: E/ActivityThread(22106):    at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1137)
    02-14 10:25:14.248: E/ActivityThread(22106):    at android.app.Activity.onCreateView(Activity.java:4746)
    02-14 10:25:14.248: E/ActivityThread(22106):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689)
    02-14 10:25:14.248: E/ActivityThread(22106):    ... 21 more
    02-14 10:25:14.258: D/AndroidRuntime(22106): Shutting down VM
    02-14 10:25:14.258: W/dalvikvm(22106): threadid=1: thread exiting with uncaught exception (group=0x415687c0)
    02-14 10:25:14.268: E/AndroidRuntime(22106): FATAL EXCEPTION: main
    02-14 10:25:14.268: E/AndroidRuntime(22106): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.MainActivity}: android.view.InflateException: Binary XML file line #7: Error inflating class fragment
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.app.ActivityThread.access$600(ActivityThread.java:153)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.os.Handler.dispatchMessage(Handler.java:99)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.os.Looper.loop(Looper.java:137)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.app.ActivityThread.main(ActivityThread.java:5289)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at java.lang.reflect.Method.invokeNative(Native Method)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at java.lang.reflect.Method.invoke(Method.java:525)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at dalvik.system.NativeStart.main(Native Method)
    02-14 10:25:14.268: E/AndroidRuntime(22106): Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class fragment
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:320)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.app.Activity.setContentView(Activity.java:1895)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at com.example.test.MainActivity.onCreate(MainActivity.java:40)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.app.Activity.performCreate(Activity.java:5133)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2293)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    ... 11 more
    02-14 10:25:14.268: E/AndroidRuntime(22106): Caused by: java.lang.NullPointerException
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at com.example.test.List.onCreateView(MyList.java:27)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.app.Fragment.performCreateView(Fragment.java:1695)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:861)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1137)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.app.Activity.onCreateView(Activity.java:4746)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689)
    02-14 10:25:14.268: E/AndroidRuntime(22106):    ... 21 more
Was it helpful?

Solution

Remove this import

import android.app.Fragment;

and import Fragment from support library..

import android.support.v4.app.Fragment;

that too your list object is null in onCreateView method.. so move this

list.setOnItemClickListener(new OnItemClickListener(){

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {

            System.out.println("Works!");
        }
        });

to onStart method..

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top