Вопрос

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?

Это было полезно?

Решение 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.

Другие советы

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top