Question

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

Here's the 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's 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 my 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?

Was it helpful?

Solution 2

First, you're calling findViewById() on null convertView and not the recently inflated rowView.

You also forgot to store the view holder object with setTag(). Add

rowView.setTag(holder);

to the if (rowView == null) block.

OTHER TIPS

Consider the case when convertView is null. rowView will be assigned the same value (null) and so you will enter this if block.

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);
}

You assign rowView a value, but convertView is still pointing to null at this point. This is probably where you are running into the exception. You could call findViewById on rowView instead to get around this.

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