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
Thompson Edolo
488 PointsFATAL 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
Thompson Edolo
488 PointsOops, i noticed that i wasn't setting the tag.
Adding this solved it
convertView.setTag(holder);
Ben Jakuben
Treehouse TeacherWhich 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?
Thompson Edolo
488 PointsYes. 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
Treehouse TeacherOkay, 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.