Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

Android

FATAL EXCEPTION on my Custom ListView adapter

Hi guys,

Excellent work by the way. I was trying to implement a search interface(crudely) on ParseUser objects and I'm running into problems.

Here's my search method:

 private void QueryUser() {
        FlatEditText gUname;
        gUname = (FlatEditText)findViewById(R.id.search_editText);

        String gUsername = gUname.getText().toString();

        Log.d("singleTune", "Check for "+gUsername);
        ParseQuery<ParseUser> query = ParseUser.getQuery();
        query.whereEqualTo("username", gUsername);
        query.orderByAscending(ParseConstants.KEY_USERNAME);
        query.setLimit(1000);
        query.findInBackground(new FindCallback<ParseUser>() {
            @Override
            public void done(List<ParseUser> users, ParseException e) {
                if(e != null){
                    Log.d("singleTune", "Nothing found");
                }else{
                    mUsers = users;
                    String[] usernames = new String[mUsers.size()];
                    int i = 0;
                    for(ParseUser user : mUsers){
                        usernames[i] = user.getUsername();
                        i++;
                    }
                    UserListAdapter adapter = new UserListAdapter(SearchActivity.this, mUsers);
                    setListAdapter(adapter);
                }

            }
        });
    }

Here is my adapter:

public class UserListAdapter extends ArrayAdapter<ParseUser> {

    protected Context mContext;
    protected List<ParseUser> mParseUsers;

    public UserListAdapter(Context context, List<ParseUser> users){
        super(context, R.layout.user_item, users);
        mContext = context;
        mParseUsers = users;
    }

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

        View rowView = convertView;
        ViewHolder holder;

        if (rowView == null){
            rowView = LayoutInflater.from(mContext).inflate(R.layout.user_item, null);
            holder = new ViewHolder();
            holder.avatar = (ImageView)convertView.findViewById(R.id.user_imageView);
            holder.usernameLabel = (TextView)convertView.findViewById(R.id.username_textView);
            holder.followButton = (FlatButton)convertView.findViewById(R.id.item_follow_button);
        }
        else{
            holder = (ViewHolder)convertView.getTag();
        }

        ParseUser user = mParseUsers.get(position);
        Log.d("SingleTune", "Username from query is "+user.getUsername());
        holder.avatar.setImageResource(R.drawable.ic_action_picture);
        holder.usernameLabel.setText(user.getString(ParseConstants.KEY_USERNAME));

        return rowView                                                                                                                                                                                                                                                                                                                                                                                                                                                                      ;
    }

    private static class ViewHolder{
        ImageView avatar;
        TextView usernameLabel;
        FlatButton followButton;
    }
}

and here's the logcat:

04-30 08:09:04.727    1144-1144/com.pixel.singletune.app E/AndroidRuntime? FATAL EXCEPTION: main
    java.lang.NullPointerException
            at adapters.UserListAdapter.getView(UserListAdapter.java:43)
            at android.widget.AbsListView.obtainView(AbsListView.java:2267)
            at android.widget.ListView.measureHeightOfChildren(ListView.java:1244)
            at android.widget.ListView.onMeasure(ListView.java:1156)
            at android.view.View.measure(View.java:15172)
            at android.widget.RelativeLayout.measureChild(RelativeLayout.java:602)
            at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:415)
            at android.view.View.measure(View.java:15172)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at android.view.View.measure(View.java:15172)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:833)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
            at android.view.View.measure(View.java:15172)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2148)
            at android.view.View.measure(View.java:15172)
            at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1848)
            at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1100)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1273)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
            at android.view.Choreographer.doCallbacks(Choreographer.java:555)
            at android.view.Choreographer.doFrame(Choreographer.java:525)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
            at android.os.Handler.handleCallback(Handler.java:615)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4745)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method) 

I'm stumped guys. Any help?

3 Answers

Oops, i noticed that i wasn't setting the tag.

Adding this solved it

convertView.setTag(holder);
Ben Jakuben
STAFF
Ben Jakuben
Treehouse Teacher

Which line in your adapter is line 43? That's the one causing the exception, from Logcat:

at adapters.UserListAdapter.getView(UserListAdapter.java:43)

It's probably one of these:

holder.avatar = (ImageView)convertView.findViewById(R.id.user_imageView);
holder.usernameLabel = (TextView)convertView.findViewById(R.id.username_textView);
holder.followButton = (FlatButton)convertView.findViewById(R.id.item_follow_button);        

Can you verify those IDs in the layout you're using, R.layout.user_item?

Yes. Those IDs are correct. This is from the user_item.xml

<ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/user_imageView"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:src="@drawable/ic_action_picture"
        android:minWidth="80dp"
        android:minHeight="80dp"
        android:maxHeight="80dp"
        android:maxWidth="80dp"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:contentDescription="@string/userAvaterPlaceholder" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="@string/username_label"
        android:id="@+id/username_textView"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@+id/user_imageView"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"/>

    <com.cengalabs.flatui.views.FlatButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/follow_button_text"
        android:id="@+id/item_follow_button"
        android:layout_marginRight="38dp"
        android:layout_alignBottom="@+id/user_imageView"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_marginBottom="15dp"
        flatui:theme="Sky"/>
Ben Jakuben
Ben Jakuben
Treehouse Teacher

Okay, in the debugger or by using Log statements, see if you can tell which variable is failing to be initialized. If you set a break point at the top of your getView() method you can step through line by line to see what line is failing and look at its parts to possibly see why it is failing.