I have some problems with my custom adapter for a ListView. I’m unsure if my problems lies with the xml files, with the data or with the instantiation of the ListView. I’m getting a NullPointerException when I set the adapter. The adapter class:
public class InboxAdapter extends BaseAdapter {
private Context context;
private List<MailInbox> mails;
public InboxAdapter(Context context, List<MailInbox> mails)
{
this.context = context;
this.mails = mails;
}
@Override
public int getCount() {
return mails.size();
}
@Override
public Object getItem(int item) {
return mails.get(item);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
MailInbox entry = mails.get(position);
if(convertView == null)
{
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.mail_list_row, null);
}
ImageView mailImg = (ImageView)convertView.findViewById(R.id.mail_thumb);
boolean read = entry.IsRead;
if(read)
{
//Set "read" image
mailImg.setImageResource(R.drawable.message);
} else
{
//Set "unread" image
mailImg.setImageResource(R.drawable.message);
}
TextView author = (TextView)convertView.findViewById(R.id.mail_text);
TextView body = (TextView)convertView.findViewById(R.id.mail_detail);
TextView date = (TextView)convertView.findViewById(R.id.mail_date);
author.setText(entry.AuthorName);
body.setText(entry.MessageBody);
date.setText(entry.CreatedAt);
return convertView;
}
}
The Activity where I use it:
public class InboxActivity extends SherlockActivity
{
private ListView list;
private GetMessagesConnection mMessages;
public String kidID;
public InboxActivity() {
// TODO Auto-generated constructor stub
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.inbox_layout);
Bundle extras = getIntent().getExtras();
if(extras != null)
{
kidID = extras.getString("kidID");
}
new GetMails().execute();
}
private void setUpList()
{
list = (ListView)findViewById(R.id.mail_list);
ArrayList<MailInbox> mails = new ArrayList<MailInbox>();
for(int i = 0; i < mMessages.myMail.size(); i++)
{
MailInbox inbox = new MailInbox();
inbox.AuthorName = mMessages.myMail.get(i).AuthorName;
inbox.CreatedAt = mMessages.myMail.get(i).CreatedAt;
inbox.MessageBody = mMessages.myMail.get(i).MessageBody;
inbox.IsRead = mMessages.myMail.get(i).IsRead;
System.out.println("Author: " + inbox.AuthorName);
System.out.println("Time: " + inbox.CreatedAt);
System.out.println("Message: " + inbox.MessageBody);
System.out.println("Read: " + inbox.IsRead);
mails.add(inbox);
}
int length = mails.size();
System.out.println("Size: " + length);
InboxAdapter adapter = new InboxAdapter(this, mails);
// It crashes here with a Nullpointer Exception
list.setAdapter(adapter);
}
private class GetMails extends AsyncTask<Void, Void, Void> implements DialogInterface.OnCancelListener
{
private ProgressDialog dialog;
protected void onPreExecute()
{
dialog = ProgressDialog.show(InboxActivity.this, "", "Henter beskeder...", true);
}
protected Void doInBackground(Void... unused)
{
mMessages = new GetMessagesConnection();
mMessages.kidID = kidID;
mMessages.connection();
return null;
}
protected void onPostExecute(Void unused)
{
dialog.dismiss();
setUpList();
}
public void onCancel(DialogInterface dialog)
{
cancel(true);
dialog.dismiss();
}
}
}
*mail_list*:
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mail_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="2" >
</ListView>
*mail_list_row*:
<?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="48dip"
android:background="@drawable/listselector"
>
<ImageView
android:id="@+id/mail_thumb"
android:layout_width="30dip"
android:layout_height="30dip"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true"
android:contentDescription="@string/imgdesc"
/>
<TextView
android:id="@+id/mail_text"
android:layout_toRightOf="@+id/mail_thumb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14dip"
android:layout_marginLeft="8dip"
android:layout_centerVertical="false"
android:singleLine="true"
android:ellipsize="end"
android:textStyle="bold"
android:textColor="@android:color/white"
/>
<TextView
android:id="@+id/mail_detail"
android:layout_toRightOf="@+id/mail_thumb"
android:layout_below="@+id/mail_text"
android:layout_width="100dip"
android:layout_height="wrap_content"
android:textSize="12dip"
android:layout_marginLeft="8dip"
android:layout_centerVertical="false"
android:singleLine="true"
android:ellipsize="end"
android:textColor="@color/grey"
/>
<TextView
android:id="@+id/mail_date"
android:layout_toRightOf="@+id/mail_detail"
android:layout_below="@+id/mail_text"
android:layout_width="100dip"
android:layout_height="wrap_content"
android:textSize="12dip"
android:singleLine="true"
android:ellipsize="end"
android:textColor="@color/grey"
android:layout_alignParentRight="true"
/>
</RelativeLayout>
I don’t know what could be null. I’ve been trying to solve this for several hours.
Error log:
05-14 19:55:45.525: E/AndroidRuntime(2509): FATAL EXCEPTION: main
05-14 19:55:45.525: E/AndroidRuntime(2509): java.lang.NullPointerException
05-14 19:55:45.525: E/AndroidRuntime(2509): at com.cim.daycare.InboxActivity.setUpList(InboxActivity.java:75)
05-14 19:55:45.525: E/AndroidRuntime(2509): at com.cim.daycare.InboxActivity.access$2(InboxActivity.java:36)
05-14 19:55:45.525: E/AndroidRuntime(2509): at com.cim.daycare.InboxActivity$GetMails.onPostExecute(InboxActivity.java:101)
05-14 19:55:45.525: E/AndroidRuntime(2509): at com.cim.daycare.InboxActivity$GetMails.onPostExecute(InboxActivity.java:1)
05-14 19:55:45.525: E/AndroidRuntime(2509): at android.os.AsyncTask.finish(AsyncTask.java:417)
05-14 19:55:45.525: E/AndroidRuntime(2509): at android.os.AsyncTask.access$300(AsyncTask.java:127)
05-14 19:55:45.525: E/AndroidRuntime(2509): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
05-14 19:55:45.525: E/AndroidRuntime(2509): at android.os.Handler.dispatchMessage(Handler.java:99)
05-14 19:55:45.525: E/AndroidRuntime(2509): at android.os.Looper.loop(Looper.java:123)
05-14 19:55:45.525: E/AndroidRuntime(2509): at android.app.ActivityThread.main(ActivityThread.java:3683)
05-14 19:55:45.525: E/AndroidRuntime(2509): at java.lang.reflect.Method.invokeNative(Native Method)
05-14 19:55:45.525: E/AndroidRuntime(2509): at java.lang.reflect.Method.invoke(Method.java:507)
05-14 19:55:45.525: E/AndroidRuntime(2509): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-14 19:55:45.525: E/AndroidRuntime(2509): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-14 19:55:45.525: E/AndroidRuntime(2509): at dalvik.system.NativeStart.main(Native Method)
In the activity
InboxActivityyou set the content view toR.layout.inbox_layout(I don’t see this file in your question) and you search for theListViewwith the idR.id.mail_list. AListViewwith thisidexist in themail_list.xmlfile. Are you sure that the content view for theInboxActivityisn’tR.layout.mail_list:Also:
Please don’t declare a constructor for the
InboxActivity, initialize what you want in theonCreatemethod(this is how things work in the android world).Do you handle the cases when
extrasisnull? (If theextrasisnullthenkidIDwill also benulland this could put you in trouble in theGetMessagesConnectionclass if you don’t handle this scenario).