0

I am getting a NullPointerException - I am trying to inflate a ListView inside a Fragment.

The stacktrace of the Exception is

    03-16 22:46:41.721: W/dalvikvm(1571): threadid=1: thread exiting with uncaught exception (group=0x400207d8)
    03-16 22:46:41.840: E/AndroidRuntime(1571): FATAL EXCEPTION: main
    03-16 22:46:41.840: E/AndroidRuntime(1571): java.lang.NullPointerException
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at net.justanotherblog.swipeview.CustomListAdapter.getView(CustomListAdapter.java:49)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.widget.AbsListView.obtainView(AbsListView.java:1315)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.widget.ListView.makeAndAddView(ListView.java:1727)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.widget.ListView.fillDown(ListView.java:652)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.widget.ListView.fillFromTop(ListView.java:709)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.widget.ListView.layoutChildren(ListView.java:1580)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.widget.AbsListView.onLayout(AbsListView.java:1147)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.view.View.layout(View.java:7035)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.widget.LinearLayout.onLayout(LinearLayout.java:1042)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.view.View.layout(View.java:7035)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.view.View.layout(View.java:7035)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1528)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.view.View.layout(View.java:7035)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.view.View.layout(View.java:7035)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.widget.LinearLayout.onLayout(LinearLayout.java:1042)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.view.View.layout(View.java:7035)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.view.View.layout(View.java:7035)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1045)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.os.Handler.dispatchMessage(Handler.java:99)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.os.Looper.loop(Looper.java:123)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at android.app.ActivityThread.main(ActivityThread.java:4627)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at java.lang.reflect.Method.invokeNative(Native Method)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at java.lang.reflect.Method.invoke(Method.java:521)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:876)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634)
    03-16 22:46:41.840: E/AndroidRuntime(1571):     at dalvik.system.NativeStart.main(Native Method)

Class Code

    public static class Songs_Fragment extends Fragment {

    public Songs_Fragment() {
    }

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

        View rootView = inflater.inflate(R.layout.songs_fragment, container, false);

        ListView lv1 = (ListView) rootView.findViewById(R.id.songs_list);
        ArrayList<NewsItem> image_details = getListData();

        CustomListAdapter C_Adapter = new CustomListAdapter(getActivity(),image_details);
        lv1.setAdapter(C_Adapter);
        return rootView;
    }

GetView method of customadapter

    public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    View  row = convertView;

    if (row == null) {
        LayoutInflater inflater = LayoutInflater.from(this.context);
        row = inflater.inflate(R.layout.listview_movies, parent, false);
        holder = new ViewHolder();
        holder.headlineView = (TextView) convertView.findViewById(R.id.title);
        holder.reporterNameView = (TextView) convertView.findViewById(R.id.reporter);
        holder.reportedDateView = (TextView) convertView.findViewById(R.id.date);
        holder.imageView = (ImageView) convertView.findViewById(R.id.thumbImage);
        row.setTag(holder);
    } else {
        holder = (ViewHolder) row.getTag();
    }

    NewsItem newsItem = (NewsItem) listData.get(position);

    holder.headlineView.setText(newsItem.getHeadline());
    holder.reporterNameView.setText("By, " + newsItem.getReporterName());
    holder.reportedDateView.setText(newsItem.getDate());

    if (holder.imageView != null) {
        new ImageDownloaderTask(holder.imageView).execute(newsItem.getUrl());
    }

    return row;
}

static class ViewHolder {
    TextView headlineView;
    TextView reporterNameView;
    TextView reportedDateView;
    ImageView imageView;
}

The 49th line in trace is holder.headlineView = (TextView) convertView.findViewById(R.id.title);

Finally here is the listview_movies.xml

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:minHeight="50dp"
android:orientation="horizontal" >

<ImageView
    android:id="@+id/thumbImage"
    android:layout_width="70dp"
    android:layout_height="70dp"
    android:layout_alignParentLeft="true"
    android:layout_centerVertical="true"
    android:background="@drawable/list_placeholder" />

<TextView
    android:id="@+id/title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/thumbImage"
    android:paddingLeft="5dp"
    android:paddingTop="5dp"
    android:text=""
    android:textColor="@drawable/list_item_text_selector"
    android:textStyle="bold"
    android:typeface="sans" />

<TextView
    android:id="@+id/reporter"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/title"
    android:layout_marginTop="5dip"
    android:layout_toRightOf="@id/thumbImage"
    android:paddingLeft="5dp"
    android:text=""
    android:textColor="@drawable/list_item_text_selector"
    android:textSize="12sp" />

<TextView
    android:id="@+id/date"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/reporter"
    android:layout_alignBottom="@+id/reporter"
    android:layout_alignParentRight="true"
    android:paddingRight="5dp"
    android:text=""
    android:textColor="@drawable/list_item_text_selector"
    android:textSize="12sp" />

1 Answer 1

3

Change this

holder.headlineView = (TextView) convertView.findViewById(R.id.title);

to

holder.headlineView = (TextView) row.findViewById(R.id.title);

Similarly for other views

holder.reporterNameView = (TextView) row.findViewById(R.id.reporter);
holder.reportedDateView = (TextView) row.findViewById(R.id.date);
holder.imageView = (ImageView)row.findViewById(R.id.thumbImage);

Since you have

View  row = convertView;

and

row = inflater.inflate(R.layout.listview_movies, parent, false); // layout inflated

findViewById looks for a view with the id in the current inflated layout. So you need to use the View object row to initialize views.

                  OR

Edit:

As blackbelt suggested you can also avoid

View  row = convertView;

Retain the same code and change only return row; to return convertView;

Sign up to request clarification or add additional context in comments.

2 Comments

a little explanation would be nice. Also you could suggest him that he could avoid assign the convertView since he does not need (another) temporary object
Thanks for correcting - :') words cannot express my gratitude - i have been tearing my hair over this.. thanks a lot –

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.